glsl: Change the parser to use the string buffer

Signed-off-by: Thomas Helland <thomashelland90@gmail.com>
Tested-by: Dieter Nützel <Dieter at nuetzel-hh.de>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>

V2: Pointed out by Timothy
   - Fix pp.c reralloc size issue and comment

V3 - Use vprintf instead of printf where we should
   - Fixes failing make-check tests

V4 - Use buffer_append_char in a couple places
   - Use append_char in even more places
This commit is contained in:
Thomas Helland
2017-05-20 00:14:52 +02:00
parent 584a2a22ea
commit cad323f898
3 changed files with 78 additions and 164 deletions

View File

@@ -209,12 +209,7 @@ line:
| SPACE control_line
| text_line {
_glcpp_parser_print_expanded_token_list (parser, $1);
const char *newline_str = "\n";
size_t size = strlen(newline_str);
ralloc_str_append(&parser->output, newline_str,
parser->output_length, size);
parser->output_length += size;
_mesa_string_buffer_append_char(parser->output, '\n');
}
| expanded_line
;
@@ -233,20 +228,16 @@ expanded_line:
| LINE_EXPANDED integer_constant NEWLINE {
parser->has_new_line_number = 1;
parser->new_line_number = $2;
ralloc_asprintf_rewrite_tail (&parser->output,
&parser->output_length,
"#line %" PRIiMAX "\n",
$2);
_mesa_string_buffer_printf(parser->output, "#line %" PRIiMAX "\n", $2);
}
| LINE_EXPANDED integer_constant integer_constant NEWLINE {
parser->has_new_line_number = 1;
parser->new_line_number = $2;
parser->has_new_source_number = 1;
parser->new_source_number = $3;
ralloc_asprintf_rewrite_tail (&parser->output,
&parser->output_length,
"#line %" PRIiMAX " %" PRIiMAX "\n",
$2, $3);
_mesa_string_buffer_printf(parser->output,
"#line %" PRIiMAX " %" PRIiMAX "\n",
$2, $3);
}
;
@@ -264,12 +255,7 @@ define:
control_line:
control_line_success {
const char *newline_str = "\n";
size_t size = strlen(newline_str);
ralloc_str_append(&parser->output, newline_str,
parser->output_length, size);
parser->output_length += size;
_mesa_string_buffer_append_char(parser->output, '\n');
}
| control_line_error
| HASH_TOKEN LINE pp_tokens NEWLINE {
@@ -459,7 +445,7 @@ control_line_success:
glcpp_parser_resolve_implicit_version(parser);
}
| HASH_TOKEN PRAGMA NEWLINE {
ralloc_asprintf_rewrite_tail (&parser->output, &parser->output_length, "#%s", $2);
_mesa_string_buffer_printf(parser->output, "#%s", $2);
}
;
@@ -1137,133 +1123,61 @@ _token_list_equal_ignoring_space(token_list_t *a, token_list_t *b)
}
static void
_token_print(char **out, size_t *len, token_t *token)
_token_print(struct _mesa_string_buffer *out, token_t *token)
{
if (token->type < 256) {
size_t size = sizeof(char);
ralloc_str_append(out, (char *) &token->type, *len, size);
*len += size;
_mesa_string_buffer_append_char(out, token->type);
return;
}
switch (token->type) {
case INTEGER:
ralloc_asprintf_rewrite_tail (out, len, "%" PRIiMAX, token->value.ival);
_mesa_string_buffer_printf(out, "%" PRIiMAX, token->value.ival);
break;
case IDENTIFIER:
case INTEGER_STRING:
case OTHER: {
size_t size = strlen(token->value.str);
ralloc_str_append(out, token->value.str, *len, size);
*len += size;
case OTHER:
_mesa_string_buffer_append(out, token->value.str);
break;
}
case SPACE: {
const char *token_str = " ";
size_t size = strlen(token_str);
ralloc_str_append(out, token_str, *len, size);
*len += size;
case SPACE:
_mesa_string_buffer_append_char(out, ' ');
break;
}
case LEFT_SHIFT: {
const char *token_str = "<<";
size_t size = strlen(token_str);
ralloc_str_append(out, token_str, *len, size);
*len += size;
case LEFT_SHIFT:
_mesa_string_buffer_append(out, "<<");
break;
}
case RIGHT_SHIFT: {
const char *token_str = ">>";
size_t size = strlen(token_str);
ralloc_str_append(out, token_str, *len, size);
*len += size;
case RIGHT_SHIFT:
_mesa_string_buffer_append(out, ">>");
break;
}
case LESS_OR_EQUAL: {
const char *token_str = "<=";
size_t size = strlen(token_str);
ralloc_str_append(out, token_str, *len, size);
*len += size;
case LESS_OR_EQUAL:
_mesa_string_buffer_append(out, "<=");
break;
}
case GREATER_OR_EQUAL: {
const char *token_str = ">=";
size_t size = strlen(token_str);
ralloc_str_append(out, token_str, *len, size);
*len += size;
case GREATER_OR_EQUAL:
_mesa_string_buffer_append(out, ">=");
break;
}
case EQUAL: {
const char *token_str = "==";
size_t size = strlen(token_str);
ralloc_str_append(out, token_str, *len, size);
*len += size;
case EQUAL:
_mesa_string_buffer_append(out, "==");
break;
}
case NOT_EQUAL: {
const char *token_str = "!=";
size_t size = strlen(token_str);
ralloc_str_append(out, token_str, *len, size);
*len += size;
case NOT_EQUAL:
_mesa_string_buffer_append(out, "!=");
break;
}
case AND: {
const char *token_str = "&&";
size_t size = strlen(token_str);
ralloc_str_append(out, token_str, *len, size);
*len += size;
case AND:
_mesa_string_buffer_append(out, "&&");
break;
}
case OR: {
const char *token_str = "||";
size_t size = strlen(token_str);
ralloc_str_append(out, token_str, *len, size);
*len += size;
case OR:
_mesa_string_buffer_append(out, "||");
break;
}
case PASTE: {
const char *token_str = "##";
size_t size = strlen(token_str);
ralloc_str_append(out, token_str, *len, size);
*len += size;
case PASTE:
_mesa_string_buffer_append(out, "##");
break;
}
case PLUS_PLUS: {
const char *token_str = "++";
size_t size = strlen(token_str);
ralloc_str_append(out, token_str, *len, size);
*len += size;
case PLUS_PLUS:
_mesa_string_buffer_append(out, "++");
break;
}
case MINUS_MINUS: {
const char *token_str = "--";
size_t size = strlen(token_str);
ralloc_str_append(out, token_str, *len, size);
*len += size;
case MINUS_MINUS:
_mesa_string_buffer_append(out, "--");
break;
}
case DEFINED: {
const char *token_str = "defined";
size_t size = strlen(token_str);
ralloc_str_append(out, token_str, *len, size);
*len += size;
case DEFINED:
_mesa_string_buffer_append(out, "defined");
break;
}
case PLACEHOLDER:
/* Nothing to print. */
break;
@@ -1389,11 +1303,11 @@ _token_paste(glcpp_parser_t *parser, token_t *token, token_t *other)
FAIL:
glcpp_error (&token->location, parser, "");
ralloc_asprintf_rewrite_tail (&parser->info_log, &parser->info_log_length, "Pasting \"");
_token_print (&parser->info_log, &parser->info_log_length, token);
ralloc_asprintf_rewrite_tail (&parser->info_log, &parser->info_log_length, "\" and \"");
_token_print (&parser->info_log, &parser->info_log_length, other);
ralloc_asprintf_rewrite_tail (&parser->info_log, &parser->info_log_length, "\" does not give a valid preprocessing token.\n");
_mesa_string_buffer_append(parser->info_log, "Pasting \"");
_token_print(parser->info_log, token);
_mesa_string_buffer_append(parser->info_log, "\" and \"");
_token_print(parser->info_log, other);
_mesa_string_buffer_append(parser->info_log, "\" does not give a valid preprocessing token.\n");
return token;
}
@@ -1407,7 +1321,7 @@ _token_list_print(glcpp_parser_t *parser, token_list_t *list)
return;
for (node = list->head; node; node = node->next)
_token_print (&parser->output, &parser->output_length, node->token);
_token_print(parser->output, node->token);
}
void
@@ -1429,6 +1343,11 @@ add_builtin_define(glcpp_parser_t *parser, const char *name, int value)
_define_object_macro(parser, NULL, name, list);
}
/* 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
glcpp_parser_t *
glcpp_parser_create(const struct gl_extensions *extension_list,
glcpp_extension_iterator extensions, void *state, gl_api api)
@@ -1459,10 +1378,10 @@ glcpp_parser_create(const struct gl_extensions *extension_list,
parser->lex_from_list = NULL;
parser->lex_from_node = NULL;
parser->output = ralloc_strdup(parser, "");
parser->output_length = 0;
parser->info_log = ralloc_strdup(parser, "");
parser->info_log_length = 0;
parser->output = _mesa_string_buffer_create(parser,
INITIAL_PP_OUTPUT_BUF_SIZE);
parser->info_log = _mesa_string_buffer_create(parser,
INITIAL_PP_OUTPUT_BUF_SIZE);
parser->error = 0;
parser->extensions = extensions;
@@ -2453,10 +2372,10 @@ _glcpp_parser_handle_version_declaration(glcpp_parser_t *parser, intmax_t versio
}
if (explicitly_set) {
ralloc_asprintf_rewrite_tail(&parser->output, &parser->output_length,
"#version %" PRIiMAX "%s%s", version,
es_identifier ? " " : "",
es_identifier ? es_identifier : "");
_mesa_string_buffer_printf(parser->output,
"#version %" PRIiMAX "%s%s", version,
es_identifier ? " " : "",
es_identifier ? es_identifier : "");
}
}

View File

@@ -33,6 +33,8 @@
#include "util/hash_table.h"
#include "util/string_buffer.h"
#define yyscan_t void*
/* Some data types used for parser values. */
@@ -199,10 +201,8 @@ struct glcpp_parser {
int skipping;
token_list_t *lex_from_list;
token_node_t *lex_from_node;
char *output;
char *info_log;
size_t output_length;
size_t info_log_length;
struct _mesa_string_buffer *output;
struct _mesa_string_buffer *info_log;
int error;
glcpp_extension_iterator extensions;
const struct gl_extensions *extension_list;

View File

@@ -32,20 +32,16 @@ glcpp_error (YYLTYPE *locp, glcpp_parser_t *parser, const char *fmt, ...)
va_list ap;
parser->error = 1;
ralloc_asprintf_rewrite_tail(&parser->info_log,
&parser->info_log_length,
"%u:%u(%u): "
"preprocessor error: ",
locp->source,
locp->first_line,
locp->first_column);
_mesa_string_buffer_printf(parser->info_log,
"%u:%u(%u): "
"preprocessor error: ",
locp->source,
locp->first_line,
locp->first_column);
va_start(ap, fmt);
ralloc_vasprintf_rewrite_tail(&parser->info_log,
&parser->info_log_length,
fmt, ap);
_mesa_string_buffer_vprintf(parser->info_log, fmt, ap);
va_end(ap);
ralloc_asprintf_rewrite_tail(&parser->info_log,
&parser->info_log_length, "\n");
_mesa_string_buffer_append_char(parser->info_log, '\n');
}
void
@@ -53,20 +49,16 @@ glcpp_warning (YYLTYPE *locp, glcpp_parser_t *parser, const char *fmt, ...)
{
va_list ap;
ralloc_asprintf_rewrite_tail(&parser->info_log,
&parser->info_log_length,
_mesa_string_buffer_printf(parser->info_log,
"%u:%u(%u): "
"preprocessor warning: ",
locp->source,
locp->first_line,
locp->first_column);
va_start(ap, fmt);
ralloc_vasprintf_rewrite_tail(&parser->info_log,
&parser->info_log_length,
fmt, ap);
_mesa_string_buffer_vprintf(parser->info_log, fmt, ap);
va_end(ap);
ralloc_asprintf_rewrite_tail(&parser->info_log,
&parser->info_log_length, "\n");
_mesa_string_buffer_append_char(parser->info_log, '\n');
}
/* Given str, (that's expected to start with a newline terminator of some
@@ -238,10 +230,13 @@ glcpp_preprocess(void *ralloc_ctx, const char **shader, char **info_log,
glcpp_parser_resolve_implicit_version(parser);
ralloc_strcat(info_log, parser->info_log);
ralloc_strcat(info_log, parser->info_log->buf);
ralloc_steal(ralloc_ctx, parser->output);
*shader = parser->output;
/* Crimp the buffer first, to conserve memory */
_mesa_string_buffer_crimp_to_fit(parser->output);
ralloc_steal(ralloc_ctx, parser->output->buf);
*shader = parser->output->buf;
errors = parser->error;
glcpp_parser_destroy (parser);