From 9e13604bbed5ff1d33f97ecdd26a01d1a2fae8a0 Mon Sep 17 00:00:00 2001 From: LiXiaoQi Date: Fri, 28 Oct 2022 00:17:00 +0800 Subject: [PATCH] 88 points, wow hahaha! --- Reports/3-ir-gen/report.md | 4 ++++ src/cminusfc/cminusf_builder.cpp | 38 +++++++++++++++++++++++--------- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/Reports/3-ir-gen/report.md b/Reports/3-ir-gen/report.md index d0ca11b..efe38fd 100644 --- a/Reports/3-ir-gen/report.md +++ b/Reports/3-ir-gen/report.md @@ -110,6 +110,10 @@ PB20111654 李晓奇 - 发现ifelse语句忘了无条件跳转了…… - 返现布尔表达式必须使用i1类型,类型要求真的太严格了!! + + - 知道了为什么clang生成的中间代码,会把实参声明一遍再拷贝了。 + + 在我看来方便编译器代码的生成,因为重新声明,push给scope的值是指针类型而不是纯值,这在后边访问Var中有用。 ## 实验设计 diff --git a/src/cminusfc/cminusf_builder.cpp b/src/cminusfc/cminusf_builder.cpp index 1f87e97..71fbc33 100644 --- a/src/cminusfc/cminusf_builder.cpp +++ b/src/cminusfc/cminusf_builder.cpp @@ -262,18 +262,21 @@ void CminusfBuilder::visit(ASTFunDeclaration &node) { void CminusfBuilder::visit(ASTParam &node) { //!TODO: This function is empty now. // If the parameter is int|float, copy and store them + auto param_value = cur_value; switch (node.type) { case TYPE_INT: { - scope.push(node.id, cur_value); + cur_value = builder->create_alloca(INT32_T); break; } case TYPE_FLOAT: { - scope.push(node.id, cur_value); + cur_value = builder->create_alloca(FLOAT_T); break; } case TYPE_VOID: - break; + return; } + scope.push(node.id, cur_value); + builder->create_store(param_value, cur_value); } // Done? @@ -314,17 +317,30 @@ void CminusfBuilder::visit(ASTSelectionStmt &node) { node.expression->accept(*this); auto cond = cur_value; cast_to_i1(cond); - auto TBB = BasicBlock::create(builder->get_module(), "", cur_fun); - auto FBB = BasicBlock::create(builder->get_module(), "", cur_fun); - builder->create_cond_br(cond, TBB, FBB); - - builder->set_insert_point(TBB); - node.if_statement->accept(*this); - builder->create_br(FBB); - builder->set_insert_point(FBB); + auto ifBB = BasicBlock::create(builder->get_module(), "", cur_fun); + auto endBB = BasicBlock::create(builder->get_module(), "", cur_fun); if (node.else_statement) { + auto elseBB = BasicBlock::create(builder->get_module(), "", cur_fun); + builder->create_cond_br(cond, ifBB, elseBB); + + builder->set_insert_point(ifBB); + node.if_statement->accept(*this); + builder->create_br(endBB); + + builder->set_insert_point(elseBB); node.else_statement->accept(*this); + builder->create_br(endBB); + + builder->set_insert_point(endBB); + } else { + builder->create_cond_br(cond, ifBB, endBB); + + builder->set_insert_point(ifBB); + node.if_statement->accept(*this); + builder->create_br(endBB); + + builder->set_insert_point(endBB); } scope.exit(); } -- GitLab