glcpp: Use string_buffer for line continuation removal
authorThomas Helland <thomashelland90@gmail.com>
Sat, 20 May 2017 20:50:09 +0000 (22:50 +0200)
committerThomas Helland <thomashelland90@gmail.com>
Tue, 26 Sep 2017 16:25:20 +0000 (18:25 +0200)
Migrate removal of line continuations to string_buffer. Before this
it used ralloc_strncat() to append strings, which internally
each time calculates strlen() of its argument. Its argument is
entire shader, so it multiple time scans the whole shader text.

Signed-off-by: Vladislav Egorov <vegorov180@gmail.com>
Tested-by: Dieter Nützel <Dieter at nuetzel-hh.de>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>
V2: Adapt to different API of string buffer (Thomas Helland)

src/compiler/glsl/glcpp/pp.c

index 861f6e8669ab40d90d64608f526668adb85ba291..fab52227a0289166c92c34885707466697da472d 100644 (file)
@@ -97,17 +97,25 @@ skip_newline (const char *str)
        return ret;
 }
 
+/* Initial output buffer size, 4096 minus ralloc() overhead. It was selected
+ * to minimize total amount of allocated memory during shader-db run.
+ */
+#define INITIAL_PP_OUTPUT_BUF_SIZE 4048
+
 /* Remove any line continuation characters in the shader, (whether in
  * preprocessing directives or in GLSL code).
  */
 static char *
 remove_line_continuations(glcpp_parser_t *ctx, const char *shader)
 {
-       char *clean = ralloc_strdup(ctx, "");
+       struct _mesa_string_buffer *sb =
+               _mesa_string_buffer_create(ctx, INITIAL_PP_OUTPUT_BUF_SIZE);
+
        const char *backslash, *newline, *search_start;
         const char *cr, *lf;
         char newline_separator[3];
        int collapsed_newlines = 0;
+       int separator_len;
 
        backslash = strchr(shader, '\\');
 
@@ -153,6 +161,7 @@ remove_line_continuations(glcpp_parser_t *ctx, const char *shader)
                newline_separator[0] = '\n';
                newline_separator[1] = '\r';
        }
+       separator_len = strlen(newline_separator);
 
        while (true) {
                /* If we have previously collapsed any line-continuations,
@@ -172,10 +181,12 @@ remove_line_continuations(glcpp_parser_t *ctx, const char *shader)
                        if (newline &&
                            (backslash == NULL || newline < backslash))
                        {
-                               ralloc_strncat(&clean, shader,
-                                              newline - shader + 1);
+                               _mesa_string_buffer_append_len(sb, shader,
+                                                              newline - shader + 1);
                                while (collapsed_newlines) {
-                                       ralloc_strcat(&clean, newline_separator);
+                                       _mesa_string_buffer_append_len(sb,
+                                                                      newline_separator,
+                                                                      separator_len);
                                        collapsed_newlines--;
                                }
                                shader = skip_newline (newline);
@@ -196,7 +207,7 @@ remove_line_continuations(glcpp_parser_t *ctx, const char *shader)
                if (backslash[1] == '\r' || backslash[1] == '\n')
                {
                        collapsed_newlines++;
-                       ralloc_strncat(&clean, shader, backslash - shader);
+                       _mesa_string_buffer_append_len(sb, shader, backslash - shader);
                        shader = skip_newline (backslash + 1);
                        search_start = shader;
                }
@@ -204,9 +215,9 @@ remove_line_continuations(glcpp_parser_t *ctx, const char *shader)
                backslash = strchr(search_start, '\\');
        }
 
-       ralloc_strcat(&clean, shader);
+       _mesa_string_buffer_append(sb, shader);
 
-       return clean;
+       return sb->buf;
 }
 
 int