diff --git a/include/blocks/c_code_generator.h b/include/blocks/c_code_generator.h index af0ba50..7e7cc7e 100644 --- a/include/blocks/c_code_generator.h +++ b/include/blocks/c_code_generator.h @@ -89,6 +89,8 @@ class c_code_generator : public block_visitor { virtual void visit(goto_stmt::Ptr); virtual void visit(label_stmt::Ptr); + void print_pragma(stmt::Ptr); + static void generate_code(block::Ptr ast, std::ostream &oss, int indent = 0, bool decl_only = false) { c_code_generator generator(oss); generator.decl_only = decl_only; diff --git a/samples/outputs.var_names/sample67 b/samples/outputs.var_names/sample67 new file mode 100644 index 0000000..b37a8af --- /dev/null +++ b/samples/outputs.var_names/sample67 @@ -0,0 +1,11 @@ +void bar (void) { + _Pragma("omp parallel for") + for (int outer_0 = 0; outer_0 < 10; outer_0 = outer_0 + 1) { + int sum_1 = 0; + _Pragma("unroll") + for (int inner_2 = 0; inner_2 < 15; inner_2 = inner_2 + 1) { + sum_1 = sum_1 + inner_2; + } + } +} + diff --git a/samples/outputs/sample67 b/samples/outputs/sample67 new file mode 100644 index 0000000..7505c4f --- /dev/null +++ b/samples/outputs/sample67 @@ -0,0 +1,11 @@ +void bar (void) { + _Pragma("omp parallel for") + for (int var0 = 0; var0 < 10; var0 = var0 + 1) { + int var1 = 0; + _Pragma("unroll") + for (int var2 = 0; var2 < 15; var2 = var2 + 1) { + var1 = var1 + var2; + } + } +} + diff --git a/samples/sample67.cpp b/samples/sample67.cpp new file mode 100644 index 0000000..59be62b --- /dev/null +++ b/samples/sample67.cpp @@ -0,0 +1,30 @@ +// Include the headers +#include "blocks/c_code_generator.h" +#include "builder/static_var.h" +#include "builder/dyn_var.h" +#include "blocks/rce.h" +#include + +// Include the BuildIt types +using builder::dyn_var; +using builder::static_var; + +static void bar(void) { + builder::annotate("pragma: omp parallel for"); + for (dyn_var outer = 0; outer < 10; ++outer) { + dyn_var sum = 0; + builder::annotate("pragma: unroll"); + for (dyn_var inner = 0; inner < 15; ++inner) { + sum += inner; + } + } +} + +int main(int argc, char* argv[]) { + builder::builder_context context; + auto ast = context.extract_function_ast(bar, "bar"); + block::c_code_generator::generate_code(ast, std::cout, 0); + return 0; +} + + diff --git a/src/blocks/c_code_generator.cpp b/src/blocks/c_code_generator.cpp index 61cc646..c531a75 100644 --- a/src/blocks/c_code_generator.cpp +++ b/src/blocks/c_code_generator.cpp @@ -171,6 +171,7 @@ void c_code_generator::visit(assign_expr::Ptr a) { oss << " = "; a->expr1->accept(this); } + void c_code_generator::visit(expr_stmt::Ptr a) { a->expr1->accept(this); oss << ";"; @@ -180,11 +181,24 @@ void c_code_generator::visit(expr_stmt::Ptr a) { oss << s << " "; } } + +void c_code_generator::print_pragma(stmt::Ptr s) { + static std::string pragma_prefix ("pragma: "); + for (auto a: s->annotation) { + if (!a.compare(0, pragma_prefix.size(), pragma_prefix)) { + std::string pragma_value = a.substr(pragma_prefix.size()); + printer::indent(oss, curr_indent); + oss << "_Pragma(\"" << pragma_value << "\")" << std::endl; + } + } +} + void c_code_generator::visit(stmt_block::Ptr a) { oss << "{"; nextl(); curr_indent += 1; for (auto stmt : a->stmts) { + print_pragma(stmt); printer::indent(oss, curr_indent); stmt->accept(this); save_static_info(stmt);