From b72ddcdd509e19f95a58a0497344b546a3ad3c50 Mon Sep 17 00:00:00 2001 From: Yann Herklotz Date: Tue, 28 Mar 2017 19:42:58 +0100 Subject: working array references --- c_compiler/include/expression.hpp | 1 + c_compiler/src/expression.cpp | 60 +++++++++++++---------- test_deliverable/testcases/test_POINTARR.c | 10 ++++ test_deliverable/testcases/test_POINTARR_driver.c | 8 +++ 4 files changed, 53 insertions(+), 26 deletions(-) create mode 100644 test_deliverable/testcases/test_POINTARR.c create mode 100644 test_deliverable/testcases/test_POINTARR_driver.c diff --git a/c_compiler/include/expression.hpp b/c_compiler/include/expression.hpp index f11ea02..b0f1733 100644 --- a/c_compiler/include/expression.hpp +++ b/c_compiler/include/expression.hpp @@ -136,6 +136,7 @@ public: virtual Bindings printAsm(Bindings bindings, int &label_count) const; virtual void stackPosition(Bindings bindings, int &depth_count) const; virtual TypePtr getType(const Bindings &bindings) const; + std::string getOperator() const; }; diff --git a/c_compiler/src/expression.cpp b/c_compiler/src/expression.cpp index 9f99dc2..0250206 100644 --- a/c_compiler/src/expression.cpp +++ b/c_compiler/src/expression.cpp @@ -146,6 +146,21 @@ PostfixArrayElement::PostfixArrayElement(Expression *postfix_expression, Express {} Bindings PostfixArrayElement::printAsm(Bindings bindings, int &label_count) const +{ + stackPosition(bindings, label_count); + + TypePtr type_ptr = postfix_expression_->getType(bindings); + std::shared_ptr pointer_type_ptr; + pointer_type_ptr = std::dynamic_pointer_cast(type_ptr); + if(pointer_type_ptr != nullptr) + pointer_type_ptr->pointerLoad(); + else + type_ptr->load(); + printf("\tsw\t$2,%d($fp)\n", bindings.currentExpressionStackPosition()); + return bindings; +} + +void PostfixArrayElement::stackPosition(Bindings bindings, int &label_count) const { std::shared_ptr array_element (std::dynamic_pointer_cast(postfix_expression_)); @@ -172,28 +187,6 @@ Bindings PostfixArrayElement::printAsm(Bindings bindings, int &label_count) cons identifier_expression->stackPosition(bindings, label_count); printf("\tsll\t$t1,$t1,%d\n", postfix_expression_->getType(bindings)->getSize()/2); printf("\taddu\t$t0,$t0,$t1\n"); - - TypePtr type_ptr = postfix_expression_->getType(bindings); - std::shared_ptr pointer_type_ptr; - pointer_type_ptr = std::dynamic_pointer_cast(type_ptr); - if(pointer_type_ptr != nullptr) - pointer_type_ptr->pointerLoad(); - else - type_ptr->load(); - printf("\tsw\t$2,%d($fp)\n", bindings.currentExpressionStackPosition()); - return bindings; -} - -void PostfixArrayElement::stackPosition(Bindings bindings, int &label_count) const -{ - index_expression_->printAsm(bindings, label_count); - - std::shared_ptr unary_expression; - unary_expression = std::static_pointer_cast(postfix_expression_); - unary_expression->stackPosition(bindings, label_count); - - printf("\tsll\t$2,$2,%d\n\taddu\t$t0,$t0,$2\n", - unary_expression->getType(bindings)->getSize()/2); } void PostfixArrayElement::expressionDepth(int &depth_count) const @@ -379,13 +372,15 @@ OperatorUnaryExpression::OperatorUnaryExpression(const std::string &_operator, E Bindings OperatorUnaryExpression::printAsm(Bindings bindings, int &label_count) const { - cast_expression_->printAsm(bindings, label_count); + if(operator_ == "!") { + cast_expression_->printAsm(bindings, label_count); printf("\tsltu\t$2,$2,1\n\tandi\t$2,$2,0x00ff\n"); } else if(operator_ == "~") { + cast_expression_->printAsm(bindings, label_count); printf("\tnor\t$2,$0,$2\n"); } else if(operator_ == "&") @@ -397,10 +392,12 @@ Bindings OperatorUnaryExpression::printAsm(Bindings bindings, int &label_count) } else if(operator_ == "-") { + cast_expression_->printAsm(bindings, label_count); printf("\tsubu\t$2,$0,$2\n"); } else if(operator_ == "*") { + cast_expression_->printAsm(bindings, label_count); printf("\tlw\t$2,0($2)\n"); } @@ -424,6 +421,11 @@ TypePtr OperatorUnaryExpression::getType(const Bindings &bindings) const return cast_expression_->getType(bindings); } +std::string OperatorUnaryExpression::getOperator() const +{ + return operator_; +} + // CastExpression definition @@ -822,11 +824,17 @@ Bindings AssignmentExpression::printAsm(Bindings bindings, int &label_count) con rhs_->printAsm(bindings, label_count); bindings.nextExpressionStackPosition(); - std::shared_ptr rhs_tmp; - rhs_tmp = std::dynamic_pointer_cast(rhs_); + std::shared_ptr rhs_tmp_string; + std::shared_ptr rhs_tmp_address; + rhs_tmp_string = std::dynamic_pointer_cast(rhs_); + rhs_tmp_address = std::dynamic_pointer_cast(rhs_); // we are assigning so we don't have to evaluate the lhs as it will be overwritten anyways - if(rhs_tmp != nullptr) + if(rhs_tmp_string != nullptr) + { + lhs_postfix->pointerPosition(bindings); + } + else if(rhs_tmp_address != nullptr && rhs_tmp_address->getOperator() == "&") { lhs_postfix->pointerPosition(bindings); } diff --git a/test_deliverable/testcases/test_POINTARR.c b/test_deliverable/testcases/test_POINTARR.c new file mode 100644 index 0000000..bafd4bc --- /dev/null +++ b/test_deliverable/testcases/test_POINTARR.c @@ -0,0 +1,10 @@ +int pointarr(int *a, int b, int c, int d, int e) +{ + int x[2][2] = { + {b, c}, + {d, e} + }; + + a = &x[0][1]; + return *a; +} diff --git a/test_deliverable/testcases/test_POINTARR_driver.c b/test_deliverable/testcases/test_POINTARR_driver.c new file mode 100644 index 0000000..420528a --- /dev/null +++ b/test_deliverable/testcases/test_POINTARR_driver.c @@ -0,0 +1,8 @@ +int pointarr(int *, int, int, int, int); + +int main() +{ + int a = 0; + int *x = &a; + return !( 12983 == pointarr(x, 23894, 12983, 1932, 8342) ); +} -- cgit