Skip to content

Commit 1dea81f

Browse files
Merge pull request #104 from AjayBrahmakshatriya/master
Added support for printing pragmas on statements
2 parents fe4cd62 + 8485d79 commit 1dea81f

5 files changed

Lines changed: 68 additions & 0 deletions

File tree

include/blocks/c_code_generator.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,8 @@ class c_code_generator : public block_visitor {
8989
virtual void visit(goto_stmt::Ptr);
9090
virtual void visit(label_stmt::Ptr);
9191

92+
void print_pragma(stmt::Ptr);
93+
9294
static void generate_code(block::Ptr ast, std::ostream &oss, int indent = 0, bool decl_only = false) {
9395
c_code_generator generator(oss);
9496
generator.decl_only = decl_only;

samples/outputs.var_names/sample67

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
void bar (void) {
2+
_Pragma("omp parallel for")
3+
for (int outer_0 = 0; outer_0 < 10; outer_0 = outer_0 + 1) {
4+
int sum_1 = 0;
5+
_Pragma("unroll")
6+
for (int inner_2 = 0; inner_2 < 15; inner_2 = inner_2 + 1) {
7+
sum_1 = sum_1 + inner_2;
8+
}
9+
}
10+
}
11+

samples/outputs/sample67

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
void bar (void) {
2+
_Pragma("omp parallel for")
3+
for (int var0 = 0; var0 < 10; var0 = var0 + 1) {
4+
int var1 = 0;
5+
_Pragma("unroll")
6+
for (int var2 = 0; var2 < 15; var2 = var2 + 1) {
7+
var1 = var1 + var2;
8+
}
9+
}
10+
}
11+

samples/sample67.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// Include the headers
2+
#include "blocks/c_code_generator.h"
3+
#include "builder/static_var.h"
4+
#include "builder/dyn_var.h"
5+
#include "blocks/rce.h"
6+
#include <iostream>
7+
8+
// Include the BuildIt types
9+
using builder::dyn_var;
10+
using builder::static_var;
11+
12+
static void bar(void) {
13+
builder::annotate("pragma: omp parallel for");
14+
for (dyn_var<int> outer = 0; outer < 10; ++outer) {
15+
dyn_var<int> sum = 0;
16+
builder::annotate("pragma: unroll");
17+
for (dyn_var<int> inner = 0; inner < 15; ++inner) {
18+
sum += inner;
19+
}
20+
}
21+
}
22+
23+
int main(int argc, char* argv[]) {
24+
builder::builder_context context;
25+
auto ast = context.extract_function_ast(bar, "bar");
26+
block::c_code_generator::generate_code(ast, std::cout, 0);
27+
return 0;
28+
}
29+
30+

src/blocks/c_code_generator.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ void c_code_generator::visit(assign_expr::Ptr a) {
171171
oss << " = ";
172172
a->expr1->accept(this);
173173
}
174+
174175
void c_code_generator::visit(expr_stmt::Ptr a) {
175176
a->expr1->accept(this);
176177
oss << ";";
@@ -180,11 +181,24 @@ void c_code_generator::visit(expr_stmt::Ptr a) {
180181
oss << s << " ";
181182
}
182183
}
184+
185+
void c_code_generator::print_pragma(stmt::Ptr s) {
186+
static std::string pragma_prefix ("pragma: ");
187+
for (auto a: s->annotation) {
188+
if (!a.compare(0, pragma_prefix.size(), pragma_prefix)) {
189+
std::string pragma_value = a.substr(pragma_prefix.size());
190+
printer::indent(oss, curr_indent);
191+
oss << "_Pragma(\"" << pragma_value << "\")" << std::endl;
192+
}
193+
}
194+
}
195+
183196
void c_code_generator::visit(stmt_block::Ptr a) {
184197
oss << "{";
185198
nextl();
186199
curr_indent += 1;
187200
for (auto stmt : a->stmts) {
201+
print_pragma(stmt);
188202
printer::indent(oss, curr_indent);
189203
stmt->accept(this);
190204
save_static_info(stmt);

0 commit comments

Comments
 (0)