Skip to content

Commit c78b8b2

Browse files
Merge pull request #46 from AjayBrahmakshatriya/master
Added support to generate struct decls
2 parents fbfaa59 + 5e517ac commit c78b8b2

File tree

6 files changed

+182
-113
lines changed

6 files changed

+182
-113
lines changed

include/blocks/c_code_generator.h

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#define C_CODE_GENERATOR_H
33
#include "blocks/block_visitor.h"
44
#include "blocks/stmt.h"
5+
#include "builder/dyn_var.h"
56
#include "util/printer.h"
67
#include <unordered_map>
78
#include <unordered_set>
@@ -76,6 +77,34 @@ class c_code_generator : public block_visitor {
7677
ast->accept(&generator);
7778
oss << std::endl;
7879
}
80+
template <typename T>
81+
static void generate_struct_decl(std::ostream &oss, int indent = 0) {
82+
static_assert(std::is_base_of<builder::var, T>::value, "Template argument should be a dyn_var");
83+
auto save = builder::options::track_members;
84+
builder::options::track_members = true;
85+
T v = builder::with_name("_");
86+
builder::options::track_members = save;
87+
/* Dump the type */
88+
c_code_generator generator(oss);
89+
printer::indent(oss, indent);
90+
auto var_type = T::create_block_type();
91+
assert(isa<named_type>(var_type) && "Cannot create struct declarations for un-named types");
92+
assert(to<named_type>(var_type)->template_args.size() == 0 &&
93+
"Cannot yet, generate decls for types with template args");
94+
oss << "struct " << to<named_type>(var_type)->type_name << " {\n";
95+
indent++;
96+
97+
for (auto member : v.members) {
98+
printer::indent(oss, indent);
99+
auto decl = std::make_shared<decl_stmt>();
100+
decl->decl_var = member->block_var;
101+
decl->accept(&generator);
102+
oss << std::endl;
103+
}
104+
indent--;
105+
printer::indent(oss, indent);
106+
oss << "};" << std::endl;
107+
}
79108
};
80109
} // namespace block
81110
#endif

include/builder/dyn_var.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55
#include "util/var_finder.h"
66
namespace builder {
77

8+
namespace options {
9+
extern bool track_members;
10+
}
11+
812
class var {
913
public:
1014
enum var_state {
@@ -29,6 +33,9 @@ class var {
2933
// Avoid using this unless really required
3034
block::expr::Ptr encompassing_expr;
3135

36+
// Feature to gather members of this type
37+
std::vector<var *> members;
38+
3239
static block::type::Ptr create_block_type(void) {
3340
// Cannot create block type for abstract class
3441
assert(false);
@@ -223,6 +230,13 @@ class dyn_var_impl : public var {
223230
var_name = a.member_name;
224231
block_var = nullptr;
225232
block_decl_stmt = nullptr;
233+
234+
if (options::track_members) {
235+
parent_var->members.push_back(this);
236+
block_var = std::make_shared<block::var>();
237+
block_var->var_type = create_block_type();
238+
block_var->var_name = var_name;
239+
}
226240
}
227241
// Constructor and operator = to initialize a dyn_var as a compound expr
228242
// This declaration also does not produce a declaration or assign stmt

samples/outputs.var_names/sample46

Lines changed: 62 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,70 +1,78 @@
1-
STMT_BLOCK
2-
DECL_STMT
3-
NAMED_TYPE (FooT)
4-
VAR (g_0)
5-
NO_INITIALIZATION
6-
EXPR_STMT
7-
ASSIGN_EXPR
8-
VAR_EXPR
9-
VAR (g_0)
10-
PLUS_EXPR
1+
FUNC_DECL
2+
SCALAR_TYPE (VOID)
3+
STMT_BLOCK
4+
DECL_STMT
5+
NAMED_TYPE (FooT)
6+
VAR (g_0)
7+
NO_INITIALIZATION
8+
EXPR_STMT
9+
ASSIGN_EXPR
1110
VAR_EXPR
1211
VAR (g_0)
13-
INT_CONST (1)
14-
DECL_STMT
15-
SCALAR_TYPE (INT)
16-
VAR (x_1)
17-
MEMBER_ACCESS_EXPR (member)
18-
VAR_EXPR
19-
VAR (g_0)
20-
DECL_STMT
21-
NAMED_TYPE (FooT)
22-
VAR (h_2)
23-
VAR_EXPR
24-
VAR (g_0)
25-
EXPR_STMT
26-
ASSIGN_EXPR
27-
VAR_EXPR
28-
VAR (h_2)
29-
VAR_EXPR
30-
VAR (g_0)
31-
DECL_STMT
32-
NAMED_TYPE (BarT)
12+
PLUS_EXPR
13+
VAR_EXPR
14+
VAR (g_0)
15+
INT_CONST (1)
16+
DECL_STMT
3317
SCALAR_TYPE (INT)
34-
VAR (f_3)
35-
NO_INITIALIZATION
36-
EXPR_STMT
37-
ASSIGN_EXPR
38-
MEMBER_ACCESS_EXPR (second_member)
39-
VAR_EXPR
40-
VAR (f_3)
41-
PLUS_EXPR
18+
VAR (x_1)
19+
MEMBER_ACCESS_EXPR (member)
4220
VAR_EXPR
4321
VAR (g_0)
44-
INT_CONST (1)
45-
DECL_STMT
46-
NAMED_TYPE (CarT)
47-
SCALAR_TYPE (INT)
48-
NAMED_TYPE (BarT)
49-
SCALAR_TYPE (FLOAT)
50-
VAR (l_4)
51-
NO_INITIALIZATION
52-
EXPR_STMT
53-
ASSIGN_EXPR
54-
MEMBER_ACCESS_EXPR (my_member)
22+
DECL_STMT
23+
NAMED_TYPE (FooT)
24+
VAR (h_2)
25+
VAR_EXPR
26+
VAR (g_0)
27+
EXPR_STMT
28+
ASSIGN_EXPR
5529
VAR_EXPR
56-
VAR (l_4)
57-
MEMBER_ACCESS_EXPR (member)
30+
VAR (h_2)
5831
VAR_EXPR
5932
VAR (g_0)
60-
{
33+
DECL_STMT
34+
NAMED_TYPE (BarT)
35+
VAR (f_3)
36+
NO_INITIALIZATION
37+
EXPR_STMT
38+
ASSIGN_EXPR
39+
MEMBER_ACCESS_EXPR (second_member)
40+
VAR_EXPR
41+
VAR (f_3)
42+
PLUS_EXPR
43+
VAR_EXPR
44+
VAR (g_0)
45+
INT_CONST (1)
46+
DECL_STMT
47+
NAMED_TYPE (CarT)
48+
SCALAR_TYPE (INT)
49+
NAMED_TYPE (BarT)
50+
VAR (l_4)
51+
NO_INITIALIZATION
52+
EXPR_STMT
53+
ASSIGN_EXPR
54+
MEMBER_ACCESS_EXPR (my_member)
55+
VAR_EXPR
56+
VAR (l_4)
57+
MEMBER_ACCESS_EXPR (member)
58+
VAR_EXPR
59+
VAR (g_0)
60+
struct FooT {
61+
int member;
62+
};
63+
struct BarT {
64+
int my_member;
65+
int second_member;
66+
};
67+
void my_bar (void) {
6168
FooT g_0;
6269
g_0 = g_0 + 1;
6370
int x_1 = g_0.member;
6471
FooT h_2 = g_0;
6572
h_2 = g_0;
66-
BarT<int> f_3;
73+
BarT f_3;
6774
f_3.second_member = g_0 + 1;
68-
CarT<int, BarT<float>> l_4;
75+
CarT<int, BarT> l_4;
6976
l_4.my_member = g_0.member;
7077
}
78+

samples/outputs/sample46

Lines changed: 62 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,70 +1,78 @@
1-
STMT_BLOCK
2-
DECL_STMT
3-
NAMED_TYPE (FooT)
4-
VAR (var0)
5-
NO_INITIALIZATION
6-
EXPR_STMT
7-
ASSIGN_EXPR
8-
VAR_EXPR
9-
VAR (var0)
10-
PLUS_EXPR
1+
FUNC_DECL
2+
SCALAR_TYPE (VOID)
3+
STMT_BLOCK
4+
DECL_STMT
5+
NAMED_TYPE (FooT)
6+
VAR (var0)
7+
NO_INITIALIZATION
8+
EXPR_STMT
9+
ASSIGN_EXPR
1110
VAR_EXPR
1211
VAR (var0)
13-
INT_CONST (1)
14-
DECL_STMT
15-
SCALAR_TYPE (INT)
16-
VAR (var1)
17-
MEMBER_ACCESS_EXPR (member)
18-
VAR_EXPR
19-
VAR (var0)
20-
DECL_STMT
21-
NAMED_TYPE (FooT)
22-
VAR (var2)
23-
VAR_EXPR
24-
VAR (var0)
25-
EXPR_STMT
26-
ASSIGN_EXPR
27-
VAR_EXPR
28-
VAR (var2)
29-
VAR_EXPR
30-
VAR (var0)
31-
DECL_STMT
32-
NAMED_TYPE (BarT)
12+
PLUS_EXPR
13+
VAR_EXPR
14+
VAR (var0)
15+
INT_CONST (1)
16+
DECL_STMT
3317
SCALAR_TYPE (INT)
34-
VAR (var3)
35-
NO_INITIALIZATION
36-
EXPR_STMT
37-
ASSIGN_EXPR
38-
MEMBER_ACCESS_EXPR (second_member)
39-
VAR_EXPR
40-
VAR (var3)
41-
PLUS_EXPR
18+
VAR (var1)
19+
MEMBER_ACCESS_EXPR (member)
4220
VAR_EXPR
4321
VAR (var0)
44-
INT_CONST (1)
45-
DECL_STMT
46-
NAMED_TYPE (CarT)
47-
SCALAR_TYPE (INT)
48-
NAMED_TYPE (BarT)
49-
SCALAR_TYPE (FLOAT)
50-
VAR (var4)
51-
NO_INITIALIZATION
52-
EXPR_STMT
53-
ASSIGN_EXPR
54-
MEMBER_ACCESS_EXPR (my_member)
22+
DECL_STMT
23+
NAMED_TYPE (FooT)
24+
VAR (var2)
25+
VAR_EXPR
26+
VAR (var0)
27+
EXPR_STMT
28+
ASSIGN_EXPR
5529
VAR_EXPR
56-
VAR (var4)
57-
MEMBER_ACCESS_EXPR (member)
30+
VAR (var2)
5831
VAR_EXPR
5932
VAR (var0)
60-
{
33+
DECL_STMT
34+
NAMED_TYPE (BarT)
35+
VAR (var3)
36+
NO_INITIALIZATION
37+
EXPR_STMT
38+
ASSIGN_EXPR
39+
MEMBER_ACCESS_EXPR (second_member)
40+
VAR_EXPR
41+
VAR (var3)
42+
PLUS_EXPR
43+
VAR_EXPR
44+
VAR (var0)
45+
INT_CONST (1)
46+
DECL_STMT
47+
NAMED_TYPE (CarT)
48+
SCALAR_TYPE (INT)
49+
NAMED_TYPE (BarT)
50+
VAR (var4)
51+
NO_INITIALIZATION
52+
EXPR_STMT
53+
ASSIGN_EXPR
54+
MEMBER_ACCESS_EXPR (my_member)
55+
VAR_EXPR
56+
VAR (var4)
57+
MEMBER_ACCESS_EXPR (member)
58+
VAR_EXPR
59+
VAR (var0)
60+
struct FooT {
61+
int member;
62+
};
63+
struct BarT {
64+
int my_member;
65+
int second_member;
66+
};
67+
void my_bar (void) {
6168
FooT var0;
6269
var0 = var0 + 1;
6370
int var1 = var0.member;
6471
FooT var2 = var0;
6572
var2 = var0;
66-
BarT<int> var3;
73+
BarT var3;
6774
var3.second_member = var0 + 1;
68-
CarT<int, BarT<float>> var4;
75+
CarT<int, BarT> var4;
6976
var4.my_member = var0.member;
7077
}
78+

samples/sample46.cpp

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,16 @@ struct FooT : public builder::custom_type<> {
1414
};
1515

1616
template <typename T>
17-
struct BarT : public builder::custom_type<T> {
17+
struct BarT : public builder::custom_type<> {
1818
static constexpr const char *type_name = "BarT";
19-
dyn_var<int> my_member = as_member("my_member");
20-
dyn_var<int> second_member = as_member("second_member");
19+
dyn_var<T> my_member = as_member("my_member");
20+
dyn_var<T> second_member = as_member("second_member");
2121
};
2222

2323
template <typename T1, typename T2>
2424
struct CarT : public builder::custom_type<T1, T2> {
2525
static constexpr const char *type_name = "CarT";
26-
dyn_var<int> my_member = as_member("my_member");
26+
dyn_var<T2> my_member = as_member("my_member");
2727
};
2828

2929
static void bar(void) {
@@ -42,8 +42,15 @@ static void bar(void) {
4242

4343
int main(int argc, char *argv[]) {
4444
builder::builder_context context;
45-
auto ast = context.extract_ast_from_function(bar);
45+
auto ast = context.extract_function_ast(bar, "my_bar");
4646
ast->dump(std::cout, 0);
47+
48+
block::c_code_generator::generate_struct_decl<dyn_var<FooT>>(std::cout);
49+
block::c_code_generator::generate_struct_decl<dyn_var<BarT<int>>>(std::cout);
50+
51+
// Don't do this because this has a template in the generated type
52+
// block::c_code_generator::generate_struct_decl<dyn_var<CarT<int, BarT<float>>>>(std::cout);
53+
4754
block::c_code_generator::generate_code(ast, std::cout, 0);
4855
return 0;
4956
}

src/builder/builder.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
#include "util/tracer.h"
55

66
namespace builder {
7+
namespace options {
8+
bool track_members = false;
9+
}
710

811
template <>
912
std::vector<block::type::Ptr> extract_type_vector_dyn<>(void) {

0 commit comments

Comments
 (0)