From 6da061b854cc43a7bd3f8e4a14ef4f7225eef37f Mon Sep 17 00:00:00 2001 From: jpekkila Date: Wed, 19 Jun 2019 16:10:29 +0300 Subject: [PATCH] Fixed a bug in the Astaroth compiler: the boilerplate code for kernels was generated for all nested compound statements instead of just the top-level one --- acc/src/code_generator.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/acc/src/code_generator.c b/acc/src/code_generator.c index fc8eb5d..b401168 100644 --- a/acc/src/code_generator.c +++ b/acc/src/code_generator.c @@ -282,6 +282,8 @@ static int scope_start = 0; * ============================================================================= */ +static int compound_statement_nests = 0; + static void traverse(const ASTNode* node) { @@ -296,6 +298,9 @@ traverse(const ASTNode* node) if (!inside_declaration && translate(node->prefix)) printf("%s", translate(node->prefix)); + if (node->type == NODE_COMPOUND_STATEMENT) + ++compound_statement_nests; + // BOILERPLATE START//////////////////////////////////////////////////////// if (node->type == NODE_TYPE_QUALIFIER && node->token == KERNEL) inside_kernel = true; @@ -309,7 +314,7 @@ traverse(const ASTNode* node) // indices) const char* kernel_builtin_variables_boilerplate = "GEN_KERNEL_BUILTIN_VARIABLES_" "BOILERPLATE();"; - if (inside_kernel && node->type == NODE_COMPOUND_STATEMENT) { + if (inside_kernel && node->type == NODE_COMPOUND_STATEMENT && compound_statement_nests == 1) { printf("%s ", kernel_builtin_variables_boilerplate); for (int i = 0; i < num_symbols; ++i) { @@ -399,7 +404,7 @@ traverse(const ASTNode* node) printf(")"); // Closing bracket of IDX() // Generate writeback boilerplate for OUT fields - if (inside_kernel && node->type == NODE_COMPOUND_STATEMENT) { + if (inside_kernel && node->type == NODE_COMPOUND_STATEMENT && compound_statement_nests == 1) { for (int i = 0; i < num_symbols; ++i) { if (symbol_table[i].type_qualifier == OUT) { printf("WRITE_OUT(%s%s, %s);\n", inout_name_prefix, symbol_table[i].identifier, @@ -454,6 +459,9 @@ traverse(const ASTNode* node) } } + if (node->type == NODE_COMPOUND_STATEMENT) + --compound_statement_nests; + if (node->type == NODE_FUNCTION_PARAMETER_DECLARATION) inside_function_parameter_declaration = false;