Fix bug in if-statements, implement continue and break correctly
This commit is contained in:
parent
6ca1641705
commit
de702514d9
@ -119,7 +119,7 @@ namespace types {
|
|||||||
[](codegen::Builder& builder, std::shared_ptr<Type> ty, llvm::Value* ptr) {
|
[](codegen::Builder& builder, std::shared_ptr<Type> ty, llvm::Value* ptr) {
|
||||||
codegen::TypeMap structs {};
|
codegen::TypeMap structs {};
|
||||||
auto llvm_ty = ty->codegen(builder, structs);
|
auto llvm_ty = ty->codegen(builder, structs);
|
||||||
auto loaded = builder.builder->CreateLoad(llvm_ty, ptr);
|
auto loaded = builder.builder->CreateLoad(llvm_ty, ptr, "load");
|
||||||
auto const_1 = llvm::ConstantInt::get(llvm_ty, 1);
|
auto const_1 = llvm::ConstantInt::get(llvm_ty, 1);
|
||||||
auto result = builder.builder->CreateAdd(loaded, const_1, "add");
|
auto result = builder.builder->CreateAdd(loaded, const_1, "add");
|
||||||
builder.builder->CreateStore(result, ptr);
|
builder.builder->CreateStore(result, ptr);
|
||||||
@ -132,7 +132,7 @@ namespace types {
|
|||||||
[](codegen::Builder& builder, std::shared_ptr<Type> ty, llvm::Value* ptr) {
|
[](codegen::Builder& builder, std::shared_ptr<Type> ty, llvm::Value* ptr) {
|
||||||
codegen::TypeMap structs {};
|
codegen::TypeMap structs {};
|
||||||
auto llvm_ty = ty->codegen(builder, structs);
|
auto llvm_ty = ty->codegen(builder, structs);
|
||||||
auto loaded = builder.builder->CreateLoad(llvm_ty, ptr);
|
auto loaded = builder.builder->CreateLoad(llvm_ty, ptr, "load");
|
||||||
auto const_1 = llvm::ConstantInt::get(llvm_ty, 1);
|
auto const_1 = llvm::ConstantInt::get(llvm_ty, 1);
|
||||||
auto result = builder.builder->CreateAdd(loaded, const_1, "add");
|
auto result = builder.builder->CreateAdd(loaded, const_1, "add");
|
||||||
builder.builder->CreateStore(result, ptr);
|
builder.builder->CreateStore(result, ptr);
|
||||||
@ -145,7 +145,7 @@ namespace types {
|
|||||||
[](codegen::Builder& builder, std::shared_ptr<Type> ty, llvm::Value* ptr) {
|
[](codegen::Builder& builder, std::shared_ptr<Type> ty, llvm::Value* ptr) {
|
||||||
codegen::TypeMap structs {};
|
codegen::TypeMap structs {};
|
||||||
auto llvm_ty = ty->codegen(builder, structs);
|
auto llvm_ty = ty->codegen(builder, structs);
|
||||||
auto loaded = builder.builder->CreateLoad(llvm_ty, ptr);
|
auto loaded = builder.builder->CreateLoad(llvm_ty, ptr, "load");
|
||||||
auto const_1 = llvm::ConstantInt::get(llvm_ty, 1);
|
auto const_1 = llvm::ConstantInt::get(llvm_ty, 1);
|
||||||
auto result = builder.builder->CreateSub(loaded, const_1, "sub");
|
auto result = builder.builder->CreateSub(loaded, const_1, "sub");
|
||||||
builder.builder->CreateStore(result, ptr);
|
builder.builder->CreateStore(result, ptr);
|
||||||
@ -158,7 +158,7 @@ namespace types {
|
|||||||
[](codegen::Builder& builder, std::shared_ptr<Type> ty, llvm::Value* ptr) {
|
[](codegen::Builder& builder, std::shared_ptr<Type> ty, llvm::Value* ptr) {
|
||||||
codegen::TypeMap structs {};
|
codegen::TypeMap structs {};
|
||||||
auto llvm_ty = ty->codegen(builder, structs);
|
auto llvm_ty = ty->codegen(builder, structs);
|
||||||
auto loaded = builder.builder->CreateLoad(llvm_ty, ptr);
|
auto loaded = builder.builder->CreateLoad(llvm_ty, ptr, "load");
|
||||||
auto const_1 = llvm::ConstantInt::get(llvm_ty, 1);
|
auto const_1 = llvm::ConstantInt::get(llvm_ty, 1);
|
||||||
auto result = builder.builder->CreateSub(loaded, const_1, "sub");
|
auto result = builder.builder->CreateSub(loaded, const_1, "sub");
|
||||||
builder.builder->CreateStore(result, ptr);
|
builder.builder->CreateStore(result, ptr);
|
||||||
|
|||||||
@ -367,7 +367,7 @@ namespace AST {
|
|||||||
}
|
}
|
||||||
|
|
||||||
auto gep = builder.builder->CreateStructGEP(
|
auto gep = builder.builder->CreateStructGEP(
|
||||||
ptr_ty->m_inner->codegen(builder, scope.structs), struct_ptr.value, idx);
|
ptr_ty->m_inner->codegen(builder, scope.structs), struct_ptr.value, idx, "struct_gep");
|
||||||
|
|
||||||
|
|
||||||
if (scope.is_lvalue) {
|
if (scope.is_lvalue) {
|
||||||
@ -553,13 +553,15 @@ namespace AST {
|
|||||||
builder.block = then_block;
|
builder.block = then_block;
|
||||||
builder.builder->SetInsertPoint(then_block);
|
builder.builder->SetInsertPoint(then_block);
|
||||||
this->m_then->codegen(builder, scope, allocator);
|
this->m_then->codegen(builder, scope, allocator);
|
||||||
builder.builder->CreateBr(after_block);
|
if (builder.block->getTerminator() == nullptr)
|
||||||
|
builder.builder->CreateBr(after_block);
|
||||||
|
|
||||||
if (else_block.has_value()) {
|
if (else_block.has_value()) {
|
||||||
builder.block = *else_block;
|
builder.block = *else_block;
|
||||||
builder.builder->SetInsertPoint(*else_block);
|
builder.builder->SetInsertPoint(*else_block);
|
||||||
this->m_else->get()->codegen(builder, scope, allocator);
|
this->m_else->get()->codegen(builder, scope, allocator);
|
||||||
builder.builder->CreateBr(after_block);
|
if (builder.block->getTerminator() == nullptr)
|
||||||
|
builder.builder->CreateBr(after_block);
|
||||||
}
|
}
|
||||||
|
|
||||||
builder.block = after_block;
|
builder.block = after_block;
|
||||||
@ -628,10 +630,14 @@ namespace AST {
|
|||||||
|
|
||||||
builder.builder->CreateBr(cond_bb);
|
builder.builder->CreateBr(cond_bb);
|
||||||
|
|
||||||
|
codegen::Scope inner_scope{ scope };
|
||||||
|
inner_scope.continue_bb = cond_bb;
|
||||||
|
inner_scope.break_bb = after_bb;
|
||||||
|
|
||||||
// While condition
|
// While condition
|
||||||
builder.builder->SetInsertPoint(cond_bb);
|
builder.builder->SetInsertPoint(cond_bb);
|
||||||
if (this->m_cond) {
|
if (this->m_cond) {
|
||||||
auto cond_value = (*this->m_cond)->codegen(builder, scope, allocator);
|
auto cond_value = (*this->m_cond)->codegen(builder, inner_scope, allocator);
|
||||||
builder.builder->CreateCondBr(cond_value.value, inner_bb, after_bb);
|
builder.builder->CreateCondBr(cond_value.value, inner_bb, after_bb);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -641,7 +647,7 @@ namespace AST {
|
|||||||
// While loop
|
// While loop
|
||||||
builder.builder->SetInsertPoint(inner_bb);
|
builder.builder->SetInsertPoint(inner_bb);
|
||||||
builder.block = inner_bb;
|
builder.block = inner_bb;
|
||||||
this->m_loop->codegen(builder, scope, allocator);
|
this->m_loop->codegen(builder, inner_scope, allocator);
|
||||||
builder.builder->CreateBr(cond_bb);
|
builder.builder->CreateBr(cond_bb);
|
||||||
|
|
||||||
// After
|
// After
|
||||||
|
|||||||
@ -151,7 +151,7 @@ namespace types {
|
|||||||
|
|
||||||
std::pair<llvm::Value*, std::shared_ptr<Type>> PointerType::load(codegen::Builder& builder, llvm::Value* ptr, codegen::TypeMap& structs) {
|
std::pair<llvm::Value*, std::shared_ptr<Type>> PointerType::load(codegen::Builder& builder, llvm::Value* ptr, codegen::TypeMap& structs) {
|
||||||
return std::pair(
|
return std::pair(
|
||||||
builder.builder->CreateLoad(this->m_inner->codegen(builder, structs), ptr),
|
builder.builder->CreateLoad(this->m_inner->codegen(builder, structs), ptr, "load"),
|
||||||
this->m_inner
|
this->m_inner
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
12
test.c
12
test.c
@ -64,12 +64,12 @@ int main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Test while-loops
|
// Test while-loops
|
||||||
// int counter = 0;
|
int counter = 0;
|
||||||
// while (1) {
|
while (1) {
|
||||||
// if (counter > 10)
|
if (counter > 10)
|
||||||
// break;
|
break;
|
||||||
// printf("while-counter: %d\n", counter++);
|
printf("while-counter: %d\n", counter++);
|
||||||
// }
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue
Block a user