[code generation] some more bugfixes
This commit is contained in:
@@ -105,6 +105,7 @@ ir::value* function_definition::codegen(ir::module *mod) const{
|
|||||||
mod->seal_block(entry);
|
mod->seal_block(entry);
|
||||||
mod->get_builder().set_insert_point(entry);
|
mod->get_builder().set_insert_point(entry);
|
||||||
body_->codegen(mod);
|
body_->codegen(mod);
|
||||||
|
std::cout << mod->get_builder().get_insert_block()->get_name() << std::endl;
|
||||||
mod->get_builder().create_ret_void();
|
mod->get_builder().create_ret_void();
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@@ -128,17 +129,18 @@ ir::value* iteration_statement::codegen(ir::module *mod) const{
|
|||||||
ir::context &ctx = mod->get_context();
|
ir::context &ctx = mod->get_context();
|
||||||
ir::function *fn = builder.get_insert_block()->get_parent();
|
ir::function *fn = builder.get_insert_block()->get_parent();
|
||||||
ir::basic_block *loop_bb = ir::basic_block::create(ctx, "loop", fn);
|
ir::basic_block *loop_bb = ir::basic_block::create(ctx, "loop", fn);
|
||||||
ir::basic_block *next_bb = ir::basic_block::create(ctx, "postloop", fn);
|
|
||||||
init_->codegen(mod);
|
init_->codegen(mod);
|
||||||
builder.create_br(loop_bb);
|
builder.create_br(loop_bb);
|
||||||
builder.set_insert_point(loop_bb);
|
builder.set_insert_point(loop_bb);
|
||||||
statements_->codegen(mod);
|
statements_->codegen(mod);
|
||||||
exec_->codegen(mod);
|
exec_->codegen(mod);
|
||||||
ir::value *cond = stop_->codegen(mod);
|
ir::value *cond = stop_->codegen(mod);
|
||||||
|
ir::basic_block *next_bb = ir::basic_block::create(ctx, "postloop", fn);
|
||||||
builder.create_cond_br(cond, loop_bb, next_bb);
|
builder.create_cond_br(cond, loop_bb, next_bb);
|
||||||
builder.set_insert_point(next_bb);
|
|
||||||
mod->seal_block(loop_bb);
|
mod->seal_block(loop_bb);
|
||||||
|
mod->seal_block(builder.get_insert_block());
|
||||||
mod->seal_block(next_bb);
|
mod->seal_block(next_bb);
|
||||||
|
builder.set_insert_point(next_bb);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -161,11 +163,13 @@ ir::value* selection_statement::codegen(ir::module* mod) const{
|
|||||||
then_value_->codegen(mod);
|
then_value_->codegen(mod);
|
||||||
if(else_value_)
|
if(else_value_)
|
||||||
builder.create_br(endif_bb);
|
builder.create_br(endif_bb);
|
||||||
|
mod->seal_block(then_bb);
|
||||||
// Else
|
// Else
|
||||||
if(else_value_){
|
if(else_value_){
|
||||||
builder.set_insert_point(else_bb);
|
builder.set_insert_point(else_bb);
|
||||||
else_value_->codegen(mod);
|
else_value_->codegen(mod);
|
||||||
builder.create_br(endif_bb);
|
builder.create_br(endif_bb);
|
||||||
|
mod->seal_block(else_bb);
|
||||||
}
|
}
|
||||||
// Endif
|
// Endif
|
||||||
builder.set_insert_point(endif_bb);
|
builder.set_insert_point(endif_bb);
|
||||||
|
Reference in New Issue
Block a user