From d2f3c99660608f18502f5ede66039dcb420b0c27 Mon Sep 17 00:00:00 2001 From: LiXiaoQi Date: Thu, 27 Oct 2022 22:03:13 +0800 Subject: [PATCH] 53 points! --- Reports/3-ir-gen/report.md | 2 ++ src/cminusfc/cminusf_builder.cpp | 21 +++++++++++-------- .../testcases/lv1/assign_int_var_local.ll | 19 ----------------- 3 files changed, 14 insertions(+), 28 deletions(-) delete mode 100644 tests/3-ir-gen/testcases/lv1/assign_int_var_local.ll diff --git a/Reports/3-ir-gen/report.md b/Reports/3-ir-gen/report.md index 0c9b813..7729720 100644 --- a/Reports/3-ir-gen/report.md +++ b/Reports/3-ir-gen/report.md @@ -98,6 +98,8 @@ PB20111654 李晓奇 - 数组下标为负时要调用`neg_idx_except()` - 神奇,bool变量不能比较,所以在比较、计算的时候要做类型转换 + + - store的顺序颠倒了!! ## 实验设计 diff --git a/src/cminusfc/cminusf_builder.cpp b/src/cminusfc/cminusf_builder.cpp index a462e23..f5408a1 100644 --- a/src/cminusfc/cminusf_builder.cpp +++ b/src/cminusfc/cminusf_builder.cpp @@ -136,18 +136,20 @@ void CminusfBuilder::visit(ASTVarDeclaration &node) { case TYPE_INT: { auto I32Array_T = Type::get_array_type(INT32_T, size); if (global) - GlobalVariable::create(node.id, builder->get_module(), I32Array_T, false, I32Initializer); + cur_value = + GlobalVariable::create(node.id, builder->get_module(), I32Array_T, false, I32Initializer); else - builder->create_alloca(I32Array_T); + cur_value = builder->create_alloca(I32Array_T); break; } case TYPE_FLOAT: { auto FloatArray_T = Type::get_array_type(FLOAT_T, size); if (global) - GlobalVariable::create(node.id, builder->get_module(), FloatArray_T, false, FloatInitializer); + cur_value = + GlobalVariable::create(node.id, builder->get_module(), FloatArray_T, false, FloatInitializer); else - builder->create_alloca(FloatArray_T); + cur_value = builder->create_alloca(FloatArray_T); break; } default: @@ -159,16 +161,17 @@ void CminusfBuilder::visit(ASTVarDeclaration &node) { switch (node.type) { case TYPE_INT: if (global) - GlobalVariable::create(node.id, builder->get_module(), INT32_T, false, I32Initializer); + cur_value = GlobalVariable::create(node.id, builder->get_module(), INT32_T, false, I32Initializer); else - builder->create_alloca(INT32_T); + cur_value = builder->create_alloca(INT32_T); break; case TYPE_FLOAT: if (global) - GlobalVariable::create(node.id, builder->get_module(), FLOAT_T, false, FloatInitializer); + cur_value = + GlobalVariable::create(node.id, builder->get_module(), FLOAT_T, false, FloatInitializer); else - builder->create_alloca(INT32_T); + cur_value = builder->create_alloca(INT32_T); break; default: error_exit("Variable type(not array) is not int or float"); @@ -432,7 +435,7 @@ void CminusfBuilder::visit(ASTAssignExpression &node) { error_exit("bad type for assignment"); } // gen code - builder->create_store(addr, cur_value); + builder->create_store(cur_value, addr); } // Done diff --git a/tests/3-ir-gen/testcases/lv1/assign_int_var_local.ll b/tests/3-ir-gen/testcases/lv1/assign_int_var_local.ll deleted file mode 100644 index 3f7e954..0000000 --- a/tests/3-ir-gen/testcases/lv1/assign_int_var_local.ll +++ /dev/null @@ -1,19 +0,0 @@ -; ModuleID = 'cminus' -source_filename = "assign_int_var_local.cminus" - -declare i32 @input() - -declare void @output(i32) - -declare void @outputFloat(float) - -declare void @neg_idx_except() - -define void @main() { -label_entry: - %op0 = alloca i32 - store i32* %op0, i32 1234 - %op1 = load i32, i32* %op0 - call void @output(i32 %op1) - ret void -} -- GitLab