Skip to content

Commit 9c4f2ee

Browse files
Merge pull request #77 from FilippoCarloni/master
Adding support for bitwise negation and XOR operators and for bitwise AND, XOR, and OR compound assignments
2 parents e487e03 + 543e6f9 commit 9c4f2ee

File tree

12 files changed

+220
-0
lines changed

12 files changed

+220
-0
lines changed

include/blocks/block_replacer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,12 @@ class block_replacer : public block_visitor {
2525
virtual void visit(std::shared_ptr<unary_expr>) override;
2626
virtual void visit(std::shared_ptr<binary_expr>) override;
2727
virtual void visit(std::shared_ptr<not_expr>) override;
28+
virtual void visit(std::shared_ptr<bitwise_not_expr>) override;
2829
virtual void visit(std::shared_ptr<and_expr>) override;
2930
virtual void visit(std::shared_ptr<bitwise_and_expr>) override;
3031
virtual void visit(std::shared_ptr<or_expr>) override;
3132
virtual void visit(std::shared_ptr<bitwise_or_expr>) override;
33+
virtual void visit(std::shared_ptr<bitwise_xor_expr>) override;
3234
virtual void visit(std::shared_ptr<plus_expr>) override;
3335
virtual void visit(std::shared_ptr<minus_expr>) override;
3436
virtual void visit(std::shared_ptr<mul_expr>) override;

include/blocks/block_visitor.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,12 @@ class expr;
88
class unary_expr;
99
class binary_expr;
1010
class not_expr;
11+
class bitwise_not_expr;
1112
class and_expr;
1213
class bitwise_and_expr;
1314
class or_expr;
1415
class bitwise_or_expr;
16+
class bitwise_xor_expr;
1517
class plus_expr;
1618
class minus_expr;
1719
class mul_expr;
@@ -72,10 +74,12 @@ class block_visitor {
7274
virtual void visit(std::shared_ptr<unary_expr>);
7375
virtual void visit(std::shared_ptr<binary_expr>);
7476
virtual void visit(std::shared_ptr<not_expr>);
77+
virtual void visit(std::shared_ptr<bitwise_not_expr>);
7578
virtual void visit(std::shared_ptr<and_expr>);
7679
virtual void visit(std::shared_ptr<bitwise_and_expr>);
7780
virtual void visit(std::shared_ptr<or_expr>);
7881
virtual void visit(std::shared_ptr<bitwise_or_expr>);
82+
virtual void visit(std::shared_ptr<bitwise_xor_expr>);
7983
virtual void visit(std::shared_ptr<plus_expr>);
8084
virtual void visit(std::shared_ptr<minus_expr>);
8185
virtual void visit(std::shared_ptr<mul_expr>);

include/blocks/c_code_generator.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,12 @@ class c_code_generator : public block_visitor {
3333
void nextl(void);
3434

3535
virtual void visit(not_expr::Ptr);
36+
virtual void visit(bitwise_not_expr::Ptr);
3637
virtual void visit(and_expr::Ptr);
3738
virtual void visit(bitwise_and_expr::Ptr);
3839
virtual void visit(or_expr::Ptr);
3940
virtual void visit(bitwise_or_expr::Ptr);
41+
virtual void visit(bitwise_xor_expr::Ptr);
4042
virtual void visit(plus_expr::Ptr);
4143
virtual void visit(minus_expr::Ptr);
4244
virtual void visit(mul_expr::Ptr);

include/blocks/expr.h

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,19 @@ class not_expr : public unary_expr {
8383
}
8484
};
8585

86+
// For the bitwise not operator
87+
class bitwise_not_expr : public unary_expr {
88+
public:
89+
typedef std::shared_ptr<bitwise_not_expr> Ptr;
90+
virtual void dump(std::ostream &, int) override;
91+
virtual void accept(block_visitor *a) override {
92+
a->visit(self<bitwise_not_expr>());
93+
}
94+
virtual bool is_same(block::Ptr other) override {
95+
return unary_is_same(self<bitwise_not_expr>(), other);
96+
}
97+
};
98+
8699
class and_expr : public binary_expr {
87100
public:
88101
typedef std::shared_ptr<and_expr> Ptr;
@@ -131,6 +144,18 @@ class bitwise_or_expr : public binary_expr {
131144
}
132145
};
133146

147+
class bitwise_xor_expr : public binary_expr {
148+
public:
149+
typedef std::shared_ptr<bitwise_xor_expr> Ptr;
150+
virtual void dump(std::ostream &, int) override;
151+
virtual void accept(block_visitor *a) override {
152+
a->visit(self<bitwise_xor_expr>());
153+
}
154+
virtual bool is_same(block::Ptr other) override {
155+
return binary_is_same(self<bitwise_xor_expr>(), other);
156+
}
157+
};
158+
134159
class plus_expr : public binary_expr {
135160
public:
136161
typedef std::shared_ptr<plus_expr> Ptr;

include/builder/operator_overload.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,11 @@ typename allowed_builder_return<T1, T2>::type operator|(const T1 &a, const T2 &b
6060
typedef typename allowed_builder_return<T1, T2>::type ret_type;
6161
return ret_type(a).template builder_binary_op<block::bitwise_or_expr>((ret_type)b);
6262
}
63+
template <typename T1, typename T2>
64+
typename allowed_builder_return<T1, T2>::type operator^(const T1 &a, const T2 &b) {
65+
typedef typename allowed_builder_return<T1, T2>::type ret_type;
66+
return ret_type(a).template builder_binary_op<block::bitwise_xor_expr>((ret_type)b);
67+
}
6368

6469
template <typename T1, typename T2>
6570
typename allowed_builder_return<T1, T2>::type operator+(const T1 &a, const T2 &b) {
@@ -146,6 +151,12 @@ typename return_type_helper<T>::type operator!(const T &a) {
146151
return ret_type(a).template builder_unary_op<block::not_expr>();
147152
}
148153

154+
template <typename T>
155+
typename return_type_helper<T>::type operator~(const T &a) {
156+
typedef typename return_type_helper<T>::type ret_type;
157+
return ret_type(a).template builder_unary_op<block::bitwise_not_expr>();
158+
}
159+
149160
template <typename T>
150161
typename return_type_helper<T>::type operator&(const T &a) {
151162
typedef typename return_type_helper<T>::type ret_type;
@@ -191,6 +202,18 @@ template <typename T1, typename T2>
191202
typename allowed_builder_return<typename std::remove_reference<T1>::type, T2>::type operator/=(T1 &&a, const T2 &b) {
192203
return (a = a / b);
193204
}
205+
template <typename T1, typename T2>
206+
typename allowed_builder_return<typename std::remove_reference<T1>::type, T2>::type operator&=(T1 &&a, const T2 &b) {
207+
return (a = a & b);
208+
}
209+
template <typename T1, typename T2>
210+
typename allowed_builder_return<typename std::remove_reference<T1>::type, T2>::type operator|=(T1 &&a, const T2 &b) {
211+
return (a = a | b);
212+
}
213+
template <typename T1, typename T2>
214+
typename allowed_builder_return<typename std::remove_reference<T1>::type, T2>::type operator^=(T1 &&a, const T2 &b) {
215+
return (a = a ^ b);
216+
}
194217

195218
} // namespace builder
196219

samples/outputs.var_names/sample1

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,61 @@ STMT_BLOCK
5050
VAR_EXPR
5151
VAR (b_1)
5252
INT_CONST (3)
53+
EXPR_STMT
54+
BITWISE_XOR_EXPR
55+
VAR_EXPR
56+
VAR (a_0)
57+
VAR_EXPR
58+
VAR (b_1)
59+
EXPR_STMT
60+
ASSIGN_EXPR
61+
VAR_EXPR
62+
VAR (a_0)
63+
PLUS_EXPR
64+
VAR_EXPR
65+
VAR (a_0)
66+
VAR_EXPR
67+
VAR (b_1)
68+
EXPR_STMT
69+
ASSIGN_EXPR
70+
VAR_EXPR
71+
VAR (b_1)
72+
MUL_EXPR
73+
VAR_EXPR
74+
VAR (b_1)
75+
VAR_EXPR
76+
VAR (b_1)
77+
EXPR_STMT
78+
ASSIGN_EXPR
79+
VAR_EXPR
80+
VAR (a_0)
81+
BITWISE_AND_EXPR
82+
VAR_EXPR
83+
VAR (a_0)
84+
VAR_EXPR
85+
VAR (b_1)
86+
EXPR_STMT
87+
ASSIGN_EXPR
88+
VAR_EXPR
89+
VAR (a_0)
90+
BITWISE_OR_EXPR
91+
VAR_EXPR
92+
VAR (a_0)
93+
VAR_EXPR
94+
VAR (b_1)
95+
EXPR_STMT
96+
ASSIGN_EXPR
97+
VAR_EXPR
98+
VAR (a_0)
99+
BITWISE_XOR_EXPR
100+
VAR_EXPR
101+
VAR (a_0)
102+
VAR_EXPR
103+
VAR (b_1)
104+
EXPR_STMT
105+
BITWISE_NOT_EXPR
106+
VAR_EXPR
107+
VAR (b_1)
53108
{
54109
int a_0 = 0;
55110
int b_1 = a_0;
@@ -61,4 +116,11 @@ STMT_BLOCK
61116
a_0 | 2;
62117
a_0 >> 2;
63118
b_1 << 3;
119+
a_0 ^ b_1;
120+
a_0 = a_0 + b_1;
121+
b_1 = b_1 * b_1;
122+
a_0 = a_0 & b_1;
123+
a_0 = a_0 | b_1;
124+
a_0 = a_0 ^ b_1;
125+
~(b_1);
64126
}

samples/outputs/sample1

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,61 @@ STMT_BLOCK
5050
VAR_EXPR
5151
VAR (var1)
5252
INT_CONST (3)
53+
EXPR_STMT
54+
BITWISE_XOR_EXPR
55+
VAR_EXPR
56+
VAR (var0)
57+
VAR_EXPR
58+
VAR (var1)
59+
EXPR_STMT
60+
ASSIGN_EXPR
61+
VAR_EXPR
62+
VAR (var0)
63+
PLUS_EXPR
64+
VAR_EXPR
65+
VAR (var0)
66+
VAR_EXPR
67+
VAR (var1)
68+
EXPR_STMT
69+
ASSIGN_EXPR
70+
VAR_EXPR
71+
VAR (var1)
72+
MUL_EXPR
73+
VAR_EXPR
74+
VAR (var1)
75+
VAR_EXPR
76+
VAR (var1)
77+
EXPR_STMT
78+
ASSIGN_EXPR
79+
VAR_EXPR
80+
VAR (var0)
81+
BITWISE_AND_EXPR
82+
VAR_EXPR
83+
VAR (var0)
84+
VAR_EXPR
85+
VAR (var1)
86+
EXPR_STMT
87+
ASSIGN_EXPR
88+
VAR_EXPR
89+
VAR (var0)
90+
BITWISE_OR_EXPR
91+
VAR_EXPR
92+
VAR (var0)
93+
VAR_EXPR
94+
VAR (var1)
95+
EXPR_STMT
96+
ASSIGN_EXPR
97+
VAR_EXPR
98+
VAR (var0)
99+
BITWISE_XOR_EXPR
100+
VAR_EXPR
101+
VAR (var0)
102+
VAR_EXPR
103+
VAR (var1)
104+
EXPR_STMT
105+
BITWISE_NOT_EXPR
106+
VAR_EXPR
107+
VAR (var1)
53108
{
54109
int var0 = 0;
55110
int var1 = var0;
@@ -61,4 +116,11 @@ STMT_BLOCK
61116
var0 | 2;
62117
var0 >> 2;
63118
var1 << 3;
119+
var0 ^ var1;
120+
var0 = var0 + var1;
121+
var1 = var1 * var1;
122+
var0 = var0 & var1;
123+
var0 = var0 | var1;
124+
var0 = var0 ^ var1;
125+
~(var1);
64126
}

samples/sample1.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,13 @@ static void foo(void) {
1717
a | 2;
1818
a >> 2;
1919
b << 3;
20+
a ^ b;
21+
a+=b;
22+
b*=b;
23+
a&=b;
24+
a|=b;
25+
a^=b;
26+
~b;
2027
}
2128
int main(int argc, char *argv[]) {
2229
builder::builder_context context;

src/blocks/block_replacer.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ void block_replacer::visit(binary_expr::Ptr a) {
2727
void block_replacer::visit(not_expr::Ptr a) {
2828
unary_helper(a);
2929
}
30+
void block_replacer::visit(bitwise_not_expr::Ptr a) {
31+
unary_helper(a);
32+
}
3033
void block_replacer::visit(and_expr::Ptr a) {
3134
binary_helper(a);
3235
}
@@ -39,6 +42,9 @@ void block_replacer::visit(or_expr::Ptr a) {
3942
void block_replacer::visit(bitwise_or_expr::Ptr a) {
4043
binary_helper(a);
4144
}
45+
void block_replacer::visit(bitwise_xor_expr::Ptr a) {
46+
binary_helper(a);
47+
}
4248
void block_replacer::visit(plus_expr::Ptr a) {
4349
binary_helper(a);
4450
}

src/blocks/block_visitor.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ void block_visitor::visit(binary_expr::Ptr a) {
1414
void block_visitor::visit(not_expr::Ptr a) {
1515
a->expr1->accept(this);
1616
}
17+
void block_visitor::visit(bitwise_not_expr::Ptr a) {
18+
a->expr1->accept(this);
19+
}
1720
void block_visitor::visit(and_expr::Ptr a) {
1821
a->expr1->accept(this);
1922
a->expr2->accept(this);
@@ -30,6 +33,10 @@ void block_visitor::visit(bitwise_or_expr::Ptr a) {
3033
a->expr1->accept(this);
3134
a->expr2->accept(this);
3235
}
36+
void block_visitor::visit(bitwise_xor_expr::Ptr a) {
37+
a->expr1->accept(this);
38+
a->expr2->accept(this);
39+
}
3340
void block_visitor::visit(plus_expr::Ptr a) {
3441
a->expr1->accept(this);
3542
a->expr2->accept(this);

src/blocks/c_code_generator.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,12 @@ void c_code_generator::visit(not_expr::Ptr a) {
4848
oss << ")";
4949
}
5050

51+
void c_code_generator::visit(bitwise_not_expr::Ptr a) {
52+
oss << "~(";
53+
a->expr1->accept(this);
54+
oss << ")";
55+
}
56+
5157
static bool expr_needs_bracket(expr::Ptr a) {
5258
if (isa<binary_expr>(a))
5359
return true;
@@ -82,6 +88,9 @@ void c_code_generator::visit(or_expr::Ptr a) {
8288
void c_code_generator::visit(bitwise_or_expr::Ptr a) {
8389
emit_binary_expr(a, "|");
8490
}
91+
void c_code_generator::visit(bitwise_xor_expr::Ptr a) {
92+
emit_binary_expr(a, "^");
93+
}
8594
void c_code_generator::visit(plus_expr::Ptr a) {
8695
emit_binary_expr(a, "+");
8796
}

src/blocks/expr.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ void not_expr::dump(std::ostream &oss, int indent) {
3030
oss << "NOT_EXPR" << std::endl;
3131
expr1->dump(oss, indent + 1);
3232
}
33+
void bitwise_not_expr::dump(std::ostream &oss, int indent) {
34+
printer::indent(oss, indent);
35+
oss << "BITWISE_NOT_EXPR" << std::endl;
36+
expr1->dump(oss, indent + 1);
37+
}
3338
void and_expr::dump(std::ostream &oss, int indent) {
3439
printer::indent(oss, indent);
3540
oss << "AND_EXPR" << std::endl;
@@ -54,6 +59,12 @@ void bitwise_or_expr::dump(std::ostream &oss, int indent) {
5459
expr1->dump(oss, indent + 1);
5560
expr2->dump(oss, indent + 1);
5661
}
62+
void bitwise_xor_expr::dump(std::ostream &oss, int indent) {
63+
printer::indent(oss, indent);
64+
oss << "BITWISE_XOR_EXPR" << std::endl;
65+
expr1->dump(oss, indent + 1);
66+
expr2->dump(oss, indent + 1);
67+
}
5768
void plus_expr::dump(std::ostream &oss, int indent) {
5869
printer::indent(oss, indent);
5970
oss << "PLUS_EXPR" << std::endl;

0 commit comments

Comments
 (0)