diff options
author | Yann Herklotz <ymherklotz@gmail.com> | 2017-03-16 18:37:50 +0000 |
---|---|---|
committer | Yann Herklotz <ymherklotz@gmail.com> | 2017-03-16 18:37:50 +0000 |
commit | f7b531ebaaa784a0dcebb877ec7b831b324f3510 (patch) | |
tree | acc733a0ac5732799e6d0cc47a30da31e96e57fd /c_compiler | |
parent | 9ab7f5825f225cb42a6a0e8950f841a10db82f1b (diff) | |
download | Compiler-f7b531ebaaa784a0dcebb877ec7b831b324f3510.tar.gz Compiler-f7b531ebaaa784a0dcebb877ec7b831b324f3510.zip |
Check if function calls work
Diffstat (limited to 'c_compiler')
-rw-r--r-- | c_compiler/include/bindings.hpp | 3 | ||||
-rw-r--r-- | c_compiler/include/declaration.hpp | 2 | ||||
-rw-r--r-- | c_compiler/include/function.hpp | 8 | ||||
-rw-r--r-- | c_compiler/src/bindings.cpp | 7 | ||||
-rw-r--r-- | c_compiler/src/c_parser.y | 8 | ||||
-rw-r--r-- | c_compiler/src/declaration.cpp | 4 | ||||
-rw-r--r-- | c_compiler/src/function.cpp | 52 |
7 files changed, 71 insertions, 13 deletions
diff --git a/c_compiler/include/bindings.hpp b/c_compiler/include/bindings.hpp index 367986d..81cae69 100644 --- a/c_compiler/include/bindings.hpp +++ b/c_compiler/include/bindings.hpp @@ -29,8 +29,9 @@ private: public: VariableStackBindings(); - void insertBinding(std::string id, TypePtr type, int32_t stack_position); + void insertBinding(std::string id, TypePtr type, int stack_position); void increaseStackPosition(); + void setStackPosition(int stack_counter); void resetExpressionStack(); void nextExpressionStackPosition(); diff --git a/c_compiler/include/declaration.hpp b/c_compiler/include/declaration.hpp index 391438f..f98c495 100644 --- a/c_compiler/include/declaration.hpp +++ b/c_compiler/include/declaration.hpp @@ -35,7 +35,7 @@ public: DeclarationPtr getNext() const; DeclarationPtr getNextListItem() const; std::string getId() const; - std::string getType() const; + TypePtr getType() const; }; #endif diff --git a/c_compiler/include/function.hpp b/c_compiler/include/function.hpp index f049577..9080699 100644 --- a/c_compiler/include/function.hpp +++ b/c_compiler/include/function.hpp @@ -19,15 +19,19 @@ class Function : public Node { protected: TypePtr type_; std::string id_; - DeclarationPtr parameter_list_; StatementPtr statement_; + DeclarationPtr parameter_list_; public: - Function(const std::string& id, Declaration* parameter_list, Statement* statement); + Function(const std::string& id, Statement* statement, Declaration* parameter_list = nullptr); virtual void print() const; virtual void printXml() const; virtual VariableStackBindings printAsm(VariableStackBindings bindings) const; + + void printParameterAsm(VariableStackBindings& bindings, unsigned& stack_offset, + unsigned& frame_offset) const; + void countParameters(unsigned& parameter_count) const; }; diff --git a/c_compiler/src/bindings.cpp b/c_compiler/src/bindings.cpp index 7be0173..dda2ddc 100644 --- a/c_compiler/src/bindings.cpp +++ b/c_compiler/src/bindings.cpp @@ -6,7 +6,7 @@ // VariableStackBindings definition VariableStackBindings::VariableStackBindings() - : stack_counter_(4), expression_stack_(-4) + : stack_counter_(0), expression_stack_(-4) {} void VariableStackBindings::insertBinding(std::string id, TypePtr type, int stack_position) @@ -23,6 +23,11 @@ void VariableStackBindings::increaseStackPosition() stack_counter_ += 4; } +void VariableStackBindings::setStackPosition(int stack_counter) +{ + stack_counter_ = stack_counter; +} + void VariableStackBindings::resetExpressionStack() { expression_stack_ = -4; diff --git a/c_compiler/src/c_parser.y b/c_compiler/src/c_parser.y index 852b687..4a9f929 100644 --- a/c_compiler/src/c_parser.y +++ b/c_compiler/src/c_parser.y @@ -97,7 +97,13 @@ ExternalDeclaration: // FUNCTION DEFINITION FunctionDefinition: - DeclarationSpec T_IDENTIFIER T_LRB ParameterList T_RRB CompoundStatement { $$ = new Function(*$2, $4, $6); delete $2; } + DeclarationSpec T_IDENTIFIER T_LRB ParameterList T_RRB CompoundStatement { + if($4->getId() == "") + $$ = new Function(*$2, $6); + else + $$ = new Function(*$2, $6, $4); + delete $2; + } ; ParameterList: diff --git a/c_compiler/src/declaration.cpp b/c_compiler/src/declaration.cpp index 9faf133..d1a0f69 100644 --- a/c_compiler/src/declaration.cpp +++ b/c_compiler/src/declaration.cpp @@ -102,7 +102,7 @@ std::string Declaration::getId() const return id_; } -std::string Declaration::getType() const +TypePtr Declaration::getType() const { - return type_->getType(); + return type_; } diff --git a/c_compiler/src/function.cpp b/c_compiler/src/function.cpp index 2686287..179079e 100644 --- a/c_compiler/src/function.cpp +++ b/c_compiler/src/function.cpp @@ -6,8 +6,8 @@ // Function definition -Function::Function(const std::string& id, Declaration* parameter_list, Statement* statement) - : id_(id), parameter_list_(parameter_list), statement_(statement) +Function::Function(const std::string& id, Statement* statement, Declaration* parameter_list) + : id_(id), statement_(statement), parameter_list_(parameter_list) {} void Function::print() const @@ -59,9 +59,14 @@ VariableStackBindings Function::printAsm(VariableStackBindings bindings) const if(max_argument_count < 4) max_argument_count = 4; + + unsigned parameter_count = 0; + countParameters(parameter_count); // This adds 2 to store the frame pointer and the return address - unsigned memory_needed = 4*(variable_count + max_argument_count + 2); + unsigned memory_needed = 4*(variable_count + max_argument_count + parameter_count + 2); + + // make frame double word aligned if(memory_needed % 8 != 0) memory_needed += 4; @@ -70,12 +75,49 @@ VariableStackBindings Function::printAsm(VariableStackBindings bindings) const << memory_needed-8 << "($sp)\n\tmove\t$fp,$sp\n"; // TODO print asm for parameters + printParameterAsm(bindings, max_argument_count, memory_needed); + // set the stack counter to the right value + bindings.setStackPosition((max_argument_count+parameter_count)*4); + // Prints the asm for the compound statement in the function statement_->printAsm(bindings); - std::cout << "\tmove\t$sp,$fp\n\tlw\t$fp," << memory_needed-4 << "($sp)\n\taddiu\t$sp,$sp," - << memory_needed << "\n\tjr\t$31\n\tnop\n"; + std::cout << "\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"; return bindings; } + +void Function::printParameterAsm(VariableStackBindings& bindings, unsigned& stack_offset, + unsigned& frame_offset) const +{ + std::vector<DeclarationPtr> parameter_vector; + DeclarationPtr parameter_list = parameter_list_; + + while(parameter_list != nullptr) { + parameter_vector.push_back(parameter_list); + parameter_list = parameter_list->getNext(); + } + + for(auto itr = parameter_vector.rbegin(); itr != parameter_vector.rend(); ++itr) { + unsigned i = parameter_vector.rbegin() - itr; + bindings.insertBinding((*itr)->getId(), (*itr)->getType(), (i+stack_offset)*4); + if(i < 4) + std::cout << "\tsw\t$" << 4+i << "," << (i+stack_offset)*4 << "($fp)\n"; + else + std::cout << "\tlw\t$2," << frame_offset + 4*i << "($fp)\n\tsw\t$2," << (i+stack_offset)*4 + << "($fp)\n"; + } +} + +void Function::countParameters(unsigned& parameter_count) const +{ + DeclarationPtr parameter_list = parameter_list_; + + while(parameter_list != nullptr) { + parameter_count++; + parameter_list = parameter_list->getNext(); + } +} |