Implement "ho visto" statement.
This commit is contained in:
parent
7338102d46
commit
4b49bd28e7
|
@ -102,6 +102,7 @@ public:
|
||||||
llvm::Value* visitLoopStatement(const LoopStatement* l);
|
llvm::Value* visitLoopStatement(const LoopStatement* l);
|
||||||
llvm::Value* visitInputStatement(const InputStatement* s);
|
llvm::Value* visitInputStatement(const InputStatement* s);
|
||||||
llvm::Value* visitPrintStatement(const PrintStatement* p);
|
llvm::Value* visitPrintStatement(const PrintStatement* p);
|
||||||
|
llvm::Value* visitAssertStatement(const AssertStatement* a);
|
||||||
llvm::Value* visitAbortStatement(const AbortStatement* a);
|
llvm::Value* visitAbortStatement(const AbortStatement* a);
|
||||||
llvm::Value* visitExpressionStatement(const ExpressionStatement* s) {
|
llvm::Value* visitExpressionStatement(const ExpressionStatement* s) {
|
||||||
visit(s->getExpression());
|
visit(s->getExpression());
|
||||||
|
@ -541,6 +542,27 @@ llvm::Value* IRGenerator::visitPrintStatement(const PrintStatement* p) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
llvm::Value* IRGenerator::visitAssertStatement(const AssertStatement* a) {
|
||||||
|
llvm::BasicBlock* check_bb =
|
||||||
|
llvm::BasicBlock::Create(context_, "assert.check", current_function());
|
||||||
|
llvm::BasicBlock* fail_bb = llvm::BasicBlock::Create(context_, "assert.fail", current_function());
|
||||||
|
llvm::BasicBlock* success_bb =
|
||||||
|
llvm::BasicBlock::Create(context_, "assert.success", current_function());
|
||||||
|
|
||||||
|
builder_.CreateBr(check_bb);
|
||||||
|
|
||||||
|
builder_.SetInsertPoint(check_bb);
|
||||||
|
llvm::Value* condition = evalBooleanCondition(a->getExpression());
|
||||||
|
builder_.CreateCondBr(condition, success_bb, fail_bb);
|
||||||
|
|
||||||
|
builder_.SetInsertPoint(fail_bb);
|
||||||
|
visitAbortStatement(nullptr); // Assert is just a conditional abort.
|
||||||
|
builder_.CreateBr(success_bb); // We will never get here, but LLVM does not know.
|
||||||
|
|
||||||
|
builder_.SetInsertPoint(success_bb);
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
llvm::Value* IRGenerator::visitAbortStatement(const AbortStatement*) {
|
llvm::Value* IRGenerator::visitAbortStatement(const AbortStatement*) {
|
||||||
auto abort_builtin = module_->getFunction("abort");
|
auto abort_builtin = module_->getFunction("abort");
|
||||||
assert(abort_builtin && "Builtin abort was not declared");
|
assert(abort_builtin && "Builtin abort was not declared");
|
||||||
|
|
Reference in New Issue
Block a user