Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions include/blocks/block_replacer.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ class block_replacer : public block_visitor {
std::shared_ptr<block> to_replace;
std::shared_ptr<block> replace_with;

template <typename T = expr>
typename T::Ptr rewrite(typename T::Ptr ptr) {
template <typename T>
typename std::shared_ptr<T> rewrite(std::shared_ptr<T> ptr) {
auto tmp = node;
node = nullptr;
ptr->accept(this);
Expand Down Expand Up @@ -64,6 +64,8 @@ class block_replacer : public block_visitor {
virtual void visit(std::shared_ptr<stmt_block>) override;
virtual void visit(std::shared_ptr<decl_stmt>) override;
virtual void visit(std::shared_ptr<if_stmt>) override;
virtual void visit(std::shared_ptr<case_stmt>) override;
virtual void visit(std::shared_ptr<switch_stmt>) override;
virtual void visit(std::shared_ptr<label>) override;
virtual void visit(std::shared_ptr<label_stmt>) override;
virtual void visit(std::shared_ptr<goto_stmt>) override;
Expand All @@ -78,6 +80,7 @@ class block_replacer : public block_visitor {
virtual void visit(std::shared_ptr<foreign_expr_base>) override;
virtual void visit(std::shared_ptr<member_access_expr>) override;
virtual void visit(std::shared_ptr<addr_of_expr>) override;
virtual void visit(std::shared_ptr<cast_expr>) override;

virtual void visit(std::shared_ptr<var>) override;
virtual void visit(std::shared_ptr<type>) override;
Expand All @@ -88,6 +91,7 @@ class block_replacer : public block_visitor {
virtual void visit(std::shared_ptr<array_type>) override;
virtual void visit(std::shared_ptr<builder_var_type>) override;
virtual void visit(std::shared_ptr<named_type>) override;
virtual void visit(std::shared_ptr<anonymous_type>) override;

virtual void visit(std::shared_ptr<func_decl>) override;
virtual void visit(std::shared_ptr<struct_decl>) override;
Expand Down
8 changes: 8 additions & 0 deletions include/blocks/block_visitor.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ class expr_stmt;
class stmt_block;
class decl_stmt;
class if_stmt;
class switch_stmt;
class case_stmt;
class label;
class label_stmt;
class goto_stmt;
Expand All @@ -54,6 +56,7 @@ class initializer_list_expr;
class foreign_expr_base;
class member_access_expr;
class addr_of_expr;
class cast_expr;

class var;
class type;
Expand All @@ -64,6 +67,7 @@ class function_type;
class array_type;
class builder_var_type;
class named_type;
class anonymous_type;

class func_decl;
class struct_decl;
Expand Down Expand Up @@ -108,6 +112,8 @@ class block_visitor {
virtual void visit(std::shared_ptr<stmt_block>);
virtual void visit(std::shared_ptr<decl_stmt>);
virtual void visit(std::shared_ptr<if_stmt>);
virtual void visit(std::shared_ptr<switch_stmt>);
virtual void visit(std::shared_ptr<case_stmt>);
virtual void visit(std::shared_ptr<label>);
virtual void visit(std::shared_ptr<label_stmt>);
virtual void visit(std::shared_ptr<goto_stmt>);
Expand All @@ -122,6 +128,7 @@ class block_visitor {
virtual void visit(std::shared_ptr<foreign_expr_base>);
virtual void visit(std::shared_ptr<member_access_expr>);
virtual void visit(std::shared_ptr<addr_of_expr>);
virtual void visit(std::shared_ptr<cast_expr>);

virtual void visit(std::shared_ptr<var>);
virtual void visit(std::shared_ptr<type>);
Expand All @@ -132,6 +139,7 @@ class block_visitor {
virtual void visit(std::shared_ptr<array_type>);
virtual void visit(std::shared_ptr<builder_var_type>);
virtual void visit(std::shared_ptr<named_type>);
virtual void visit(std::shared_ptr<anonymous_type>);

virtual void visit(std::shared_ptr<func_decl>);
virtual void visit(std::shared_ptr<struct_decl>);
Expand Down
110 changes: 58 additions & 52 deletions include/blocks/c_code_generator.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,63 +32,68 @@ class c_code_generator : public block_visitor {
void save_static_info(block::Ptr a);
void nextl(void);

virtual void visit(not_expr::Ptr);
virtual void visit(unary_minus_expr::Ptr);
virtual void visit(bitwise_not_expr::Ptr);
virtual void visit(and_expr::Ptr);
virtual void visit(bitwise_and_expr::Ptr);
virtual void visit(or_expr::Ptr);
virtual void visit(bitwise_or_expr::Ptr);
virtual void visit(bitwise_xor_expr::Ptr);
virtual void visit(plus_expr::Ptr);
virtual void visit(minus_expr::Ptr);
virtual void visit(mul_expr::Ptr);
virtual void visit(div_expr::Ptr);
virtual void visit(lt_expr::Ptr);
virtual void visit(gt_expr::Ptr);
virtual void visit(lte_expr::Ptr);
virtual void visit(gte_expr::Ptr);
virtual void visit(lshift_expr::Ptr);
virtual void visit(rshift_expr::Ptr);
virtual void visit(equals_expr::Ptr);
virtual void visit(ne_expr::Ptr);
virtual void visit(mod_expr::Ptr);
virtual void visit(var_expr::Ptr);
virtual void visit(int_const::Ptr);
virtual void visit(double_const::Ptr);
virtual void visit(float_const::Ptr);
virtual void visit(string_const::Ptr);
virtual void visit(assign_expr::Ptr);
virtual void visit(expr_stmt::Ptr);
virtual void visit(stmt_block::Ptr);
virtual void visit(decl_stmt::Ptr);
virtual void visit(if_stmt::Ptr);
virtual void visit(while_stmt::Ptr);
virtual void visit(for_stmt::Ptr);
virtual void visit(break_stmt::Ptr);
virtual void visit(continue_stmt::Ptr);
virtual void visit(sq_bkt_expr::Ptr);
virtual void visit(function_call_expr::Ptr);
virtual void visit(initializer_list_expr::Ptr);
virtual void visit(not_expr::Ptr) override;
virtual void visit(unary_minus_expr::Ptr) override;
virtual void visit(bitwise_not_expr::Ptr) override;
virtual void visit(and_expr::Ptr) override;
virtual void visit(bitwise_and_expr::Ptr) override;
virtual void visit(or_expr::Ptr) override;
virtual void visit(bitwise_or_expr::Ptr) override;
virtual void visit(bitwise_xor_expr::Ptr) override;
virtual void visit(plus_expr::Ptr) override;
virtual void visit(minus_expr::Ptr) override;
virtual void visit(mul_expr::Ptr) override;
virtual void visit(div_expr::Ptr) override;
virtual void visit(lt_expr::Ptr) override;
virtual void visit(gt_expr::Ptr) override;
virtual void visit(lte_expr::Ptr) override;
virtual void visit(gte_expr::Ptr) override;
virtual void visit(lshift_expr::Ptr) override;
virtual void visit(rshift_expr::Ptr) override;
virtual void visit(equals_expr::Ptr) override;
virtual void visit(ne_expr::Ptr) override;
virtual void visit(mod_expr::Ptr) override;
virtual void visit(var_expr::Ptr) override;
virtual void visit(int_const::Ptr) override;
virtual void visit(double_const::Ptr) override;
virtual void visit(float_const::Ptr) override;
virtual void visit(string_const::Ptr) override;
virtual void visit(assign_expr::Ptr) override;
virtual void visit(expr_stmt::Ptr) override;
virtual void visit(stmt_block::Ptr) override;
virtual void visit(decl_stmt::Ptr) override;
virtual void visit(if_stmt::Ptr) override;
virtual void visit(switch_stmt::Ptr) override;
virtual void visit(case_stmt::Ptr) override;
virtual void visit(while_stmt::Ptr) override;
virtual void visit(for_stmt::Ptr) override;
virtual void visit(break_stmt::Ptr) override;
virtual void visit(continue_stmt::Ptr) override;
virtual void visit(sq_bkt_expr::Ptr) override;
virtual void visit(function_call_expr::Ptr) override;
virtual void visit(initializer_list_expr::Ptr) override;

virtual void visit(var::Ptr);
virtual void visit(scalar_type::Ptr);
virtual void visit(pointer_type::Ptr);
virtual void visit(reference_type::Ptr);
virtual void visit(array_type::Ptr);
virtual void visit(builder_var_type::Ptr);
virtual void visit(named_type::Ptr);
virtual void visit(var::Ptr) override;
virtual void visit(scalar_type::Ptr) override;
virtual void visit(pointer_type::Ptr) override;
virtual void visit(reference_type::Ptr) override;
virtual void visit(array_type::Ptr) override;
virtual void visit(builder_var_type::Ptr) override;
virtual void visit(named_type::Ptr) override;
virtual void visit(anonymous_type::Ptr) override;

virtual void visit(func_decl::Ptr);
virtual void visit(struct_decl::Ptr);
virtual void visit(return_stmt::Ptr);
virtual void visit(member_access_expr::Ptr);
virtual void visit(addr_of_expr::Ptr);
virtual void visit(func_decl::Ptr) override;
virtual void visit(struct_decl::Ptr) override;
virtual void visit(return_stmt::Ptr) override;
virtual void visit(member_access_expr::Ptr) override;
virtual void visit(addr_of_expr::Ptr) override;
virtual void visit(cast_expr::Ptr) override;

virtual void visit(goto_stmt::Ptr);
virtual void visit(label_stmt::Ptr);
virtual void visit(goto_stmt::Ptr) override;
virtual void visit(label_stmt::Ptr) override;

void print_pragma(stmt::Ptr);
void print_struct_type(struct_decl::Ptr a);
void handle_child(expr::Ptr parent, expr::Ptr child, bool is_left);

static void generate_code(block::Ptr ast, std::ostream &oss, int indent = 0, bool decl_only = false) {
Expand Down Expand Up @@ -135,6 +140,7 @@ class c_code_generator : public block_visitor {
/* Dump the type */
c_code_generator generator(oss);
sd->accept(&generator);
oss << std::endl;
}
};
} // namespace block
Expand Down
41 changes: 41 additions & 0 deletions include/blocks/expr.h
Original file line number Diff line number Diff line change
Expand Up @@ -404,19 +404,29 @@ class var_expr : public expr {
}

var::Ptr var1;
std::vector<block::Ptr> template_args;
virtual bool is_same(block::Ptr other) override {
if (!isa<var_expr>(other))
return false;
var_expr::Ptr other_expr = to<var_expr>(other);
if (!var1->is_same(other_expr->var1))
return false;
if (template_args.size() != other_expr->template_args.size())
return false;
for (unsigned i = 0; i < template_args.size(); i++) {
if (!(template_args[i]->is_same(other_expr->template_args[i])))
return false;
}
return true;
}
virtual block::Ptr clone_impl(void) override {
auto np = clone_obj(this);
// Vars are special cases and should not be cloned
// This is to avoid problems where vars are compared by pointers
np->var1 = var1;
for (auto a: template_args) {
np->template_args.push_back(clone(a));
}
return np;
}
};
Expand Down Expand Up @@ -750,6 +760,37 @@ class addr_of_expr: public unary_expr {
return np;
}
};

/* Expressions that will never be generated but could be promoted
or are useful for representing some key elements */
class cast_expr: public unary_expr {
public:
type::Ptr type1;

typedef std::shared_ptr<cast_expr> Ptr;
virtual void dump(std::ostream &oss, int) override;
virtual void accept(block_visitor* a) override {
a->visit(self<cast_expr>());
}
virtual bool is_same(block::Ptr other) override {
if (!isa<cast_expr>(other))
return false;
cast_expr::Ptr other_expr = to<cast_expr>(other);
if (!other_expr->expr1->is_same(expr1))
return false;
if (!other_expr->type1->is_same(type1))
return false;
return true;
}
virtual block::Ptr clone_impl(void) override {
auto np = clone_obj(this);
np->expr1 = clone(expr1);
np->type1 = clone(type1);
return np;
}
};


} // namespace block

#endif
Loading