From 3d77964b5739146a5285d10543df7b51e066c239 Mon Sep 17 00:00:00 2001 From: Yann Herklotz Date: Fri, 17 Mar 2017 12:17:42 +0000 Subject: Working functions --- c_compiler/include/bindings.hpp | 2 +- c_compiler/src/bindings.cpp | 5 ----- c_compiler/src/function.cpp | 2 +- c_compiler/src/statement.cpp | 9 +++------ c_compiler/test/in/IfElse.c | 8 ++++++++ 5 files changed, 13 insertions(+), 13 deletions(-) create mode 100644 c_compiler/test/in/IfElse.c (limited to 'c_compiler') diff --git a/c_compiler/include/bindings.hpp b/c_compiler/include/bindings.hpp index 81cae69..7525707 100644 --- a/c_compiler/include/bindings.hpp +++ b/c_compiler/include/bindings.hpp @@ -25,6 +25,7 @@ private: std::map bindings_; int stack_counter_; int expression_stack_; + unsigned label_count; public: VariableStackBindings(); @@ -32,7 +33,6 @@ public: void insertBinding(std::string id, TypePtr type, int stack_position); void increaseStackPosition(); void setStackPosition(int stack_counter); - void resetExpressionStack(); void nextExpressionStackPosition(); int currentStackPosition() const; diff --git a/c_compiler/src/bindings.cpp b/c_compiler/src/bindings.cpp index dda2ddc..05bd288 100644 --- a/c_compiler/src/bindings.cpp +++ b/c_compiler/src/bindings.cpp @@ -28,11 +28,6 @@ void VariableStackBindings::setStackPosition(int stack_counter) stack_counter_ = stack_counter; } -void VariableStackBindings::resetExpressionStack() -{ - expression_stack_ = -4; -} - void VariableStackBindings::nextExpressionStackPosition() { expression_stack_ -= 4; diff --git a/c_compiler/src/function.cpp b/c_compiler/src/function.cpp index 4fb9d95..6f5ba7d 100644 --- a/c_compiler/src/function.cpp +++ b/c_compiler/src/function.cpp @@ -83,7 +83,7 @@ VariableStackBindings Function::printAsm(VariableStackBindings bindings) const // Prints the asm for the compound statement in the function statement_->printAsm(bindings); - std::cout << "\tmove\t$sp,$fp\n\tlw\t$31," << memory_needed-4 << "($sp)\n\tlw\t$fp," + std::cout << "0:\n\tmove\t$sp,$fp\n\tlw\t$31," << memory_needed-4 << "($sp)\n\tlw\t$fp," << memory_needed-8 << "($sp)\n\taddiu\t$sp,$sp," << memory_needed << "\n\tjr\t$31\n\tnop\n"; diff --git a/c_compiler/src/statement.cpp b/c_compiler/src/statement.cpp index e4b30ff..9c0db49 100644 --- a/c_compiler/src/statement.cpp +++ b/c_compiler/src/statement.cpp @@ -173,10 +173,7 @@ VariableStackBindings ExpressionStatement::printAsm(VariableStackBindings bindin next_statement_->printAsm(bindings); if(expression_ != nullptr) - { - bindings.resetExpressionStack(); expression_->printAsm(bindings); - } return bindings; } @@ -222,10 +219,10 @@ VariableStackBindings JumpStatement::printAsm(VariableStackBindings bindings) co if(next_statement_ != nullptr) next_statement_->printAsm(bindings); - if(expression_ != nullptr) { - bindings.resetExpressionStack(); + if(expression_ != nullptr) expression_->printAsm(bindings); - } + + std::cout << "\tj\t0f\n"; return bindings; } diff --git a/c_compiler/test/in/IfElse.c b/c_compiler/test/in/IfElse.c new file mode 100644 index 0000000..2d49e2c --- /dev/null +++ b/c_compiler/test/in/IfElse.c @@ -0,0 +1,8 @@ +int f(int a) +{ + if(a == 2) { + return 3; + } else { + return 2; + } +} -- cgit