diff --git a/Reports/3-ir-gen/report.md b/Reports/3-ir-gen/report.md index 0c9b813bdce8d1adf38e3aba9b2ddd196606beeb..7729720409ac4c588d53d27692c04e763eccd724 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 a462e236285b9ab25b26c827a06d864b7e3b1f36..f5408a1e33b855966a681e1e9e983cbd73ca8423 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 3f7e954d2d27a69c4c52a805f85507e8c57bb8d8..0000000000000000000000000000000000000000 --- 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 -}