aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYann Herklotz <ymherklotz@gmail.com>2017-03-17 12:17:42 +0000
committerYann Herklotz <ymherklotz@gmail.com>2017-03-17 12:17:42 +0000
commit3d77964b5739146a5285d10543df7b51e066c239 (patch)
tree06206f8ff72629ef637bec920657d7f21591f65b
parentb23a8f1cedf222b583bc2fedf66b80d2e3c0d076 (diff)
downloadCompiler-3d77964b5739146a5285d10543df7b51e066c239.tar.gz
Compiler-3d77964b5739146a5285d10543df7b51e066c239.zip
Working functions
-rw-r--r--c_compiler/include/bindings.hpp2
-rw-r--r--c_compiler/src/bindings.cpp5
-rw-r--r--c_compiler/src/function.cpp2
-rw-r--r--c_compiler/src/statement.cpp9
-rw-r--r--c_compiler/test/in/IfElse.c8
5 files changed, 13 insertions, 13 deletions
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<std::string, DeclarationData> 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;
+ }
+}