Added if/else code gen
This commit is contained in:
@@ -70,6 +70,8 @@ llvm::Value *ModuleBuilder::valueForExpression(shared_ptr<Expression> expression
|
|||||||
return valueForExpression(dynamic_pointer_cast<ExpressionGrouping>(expression)->getExpression());
|
return valueForExpression(dynamic_pointer_cast<ExpressionGrouping>(expression)->getExpression());
|
||||||
case Expression::Kind::BINARY:
|
case Expression::Kind::BINARY:
|
||||||
return valueForBinary(dynamic_pointer_cast<ExpressionBinary>(expression));
|
return valueForBinary(dynamic_pointer_cast<ExpressionBinary>(expression));
|
||||||
|
case Expression::Kind::IF_ELSE:
|
||||||
|
return valueForIfElse(dynamic_pointer_cast<ExpressionIfElse>(expression));
|
||||||
default:
|
default:
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
@@ -112,3 +114,42 @@ llvm::Value *ModuleBuilder::valueForBinary(shared_ptr<ExpressionBinary> expressi
|
|||||||
return builder->CreateSRem(leftValue, rightValue);
|
return builder->CreateSRem(leftValue, rightValue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
llvm::Value *ModuleBuilder::valueForIfElse(shared_ptr<ExpressionIfElse> expression) {
|
||||||
|
shared_ptr<ExpressionBinary> conditionExpression = dynamic_pointer_cast<ExpressionBinary>(expression->getCondition());
|
||||||
|
|
||||||
|
llvm::Function *fun = builder->GetInsertBlock()->getParent();
|
||||||
|
llvm::Value *conditionValue = valueForBinary(conditionExpression);
|
||||||
|
|
||||||
|
llvm::BasicBlock *thenBlock = llvm::BasicBlock::Create(*context, "thenBlock", fun);
|
||||||
|
llvm::BasicBlock *elseBlock = llvm::BasicBlock::Create(*context, "elseBlock");
|
||||||
|
llvm::BasicBlock *mergeBlock = llvm::BasicBlock::Create(*context, "mergeBlock");
|
||||||
|
|
||||||
|
builder->CreateCondBr(conditionValue, thenBlock, elseBlock);
|
||||||
|
|
||||||
|
// Then
|
||||||
|
builder->SetInsertPoint(thenBlock);
|
||||||
|
llvm::Value *thenValue = llvm::ConstantInt::get(int32Type, 11, true);
|
||||||
|
buildStatement(expression->getThenBlock());
|
||||||
|
builder->CreateBr(mergeBlock);
|
||||||
|
thenBlock = builder->GetInsertBlock();
|
||||||
|
|
||||||
|
// Else
|
||||||
|
fun->insert(fun->end(), elseBlock);
|
||||||
|
llvm::Value *elseValue = llvm::ConstantInt::get(int32Type, 22, true);
|
||||||
|
builder->SetInsertPoint(elseBlock);
|
||||||
|
if (expression->getElseBlock() != nullptr)
|
||||||
|
buildStatement(expression->getElseBlock());
|
||||||
|
builder->CreateBr(mergeBlock);
|
||||||
|
elseBlock = builder->GetInsertBlock();
|
||||||
|
|
||||||
|
// Merge
|
||||||
|
fun->insert(fun->end(), mergeBlock);
|
||||||
|
builder->SetInsertPoint(mergeBlock);
|
||||||
|
llvm::PHINode *phi = builder->CreatePHI(int32Type, 2, "phii");
|
||||||
|
phi->addIncoming(thenValue, thenBlock);
|
||||||
|
phi->addIncoming(elseValue, elseBlock);
|
||||||
|
|
||||||
|
//return llvm::ConstantInt::get(int32Type, 42, true);
|
||||||
|
return phi;
|
||||||
|
}
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ private:
|
|||||||
llvm::Value *valueForLiteral(shared_ptr<ExpressionLiteral> expression);
|
llvm::Value *valueForLiteral(shared_ptr<ExpressionLiteral> expression);
|
||||||
llvm::Value *valueForGrouping(shared_ptr<ExpressionGrouping> expression);
|
llvm::Value *valueForGrouping(shared_ptr<ExpressionGrouping> expression);
|
||||||
llvm::Value *valueForBinary(shared_ptr<ExpressionBinary> expression);
|
llvm::Value *valueForBinary(shared_ptr<ExpressionBinary> expression);
|
||||||
|
llvm::Value *valueForIfElse(shared_ptr<ExpressionIfElse> expression);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ModuleBuilder(vector<shared_ptr<Statement>> statements);
|
ModuleBuilder(vector<shared_ptr<Statement>> statements);
|
||||||
|
|||||||
Reference in New Issue
Block a user