aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYann Herklotz <ymherklotz@gmail.com>2017-03-16 18:37:50 +0000
committerYann Herklotz <ymherklotz@gmail.com>2017-03-16 18:37:50 +0000
commitf7b531ebaaa784a0dcebb877ec7b831b324f3510 (patch)
treeacc733a0ac5732799e6d0cc47a30da31e96e57fd
parent9ab7f5825f225cb42a6a0e8950f841a10db82f1b (diff)
downloadCompiler-f7b531ebaaa784a0dcebb877ec7b831b324f3510.tar.gz
Compiler-f7b531ebaaa784a0dcebb877ec7b831b324f3510.zip
Check if function calls work
-rw-r--r--Notes.org9
-rw-r--r--c_compiler/include/bindings.hpp3
-rw-r--r--c_compiler/include/declaration.hpp2
-rw-r--r--c_compiler/include/function.hpp8
-rw-r--r--c_compiler/src/bindings.cpp7
-rw-r--r--c_compiler/src/c_parser.y8
-rw-r--r--c_compiler/src/declaration.cpp4
-rw-r--r--c_compiler/src/function.cpp52
8 files changed, 78 insertions, 15 deletions
diff --git a/Notes.org b/Notes.org
index 7139748..0c6de81 100644
--- a/Notes.org
+++ b/Notes.org
@@ -113,9 +113,14 @@
Add more expression.
***** TODO Make functions work
- CLOCK: [2017-03-16 Thu 11:44]
+****** DONE Make function calls work from expressions
+ CLOCK: [2017-03-16 Thu 16:51]--[2017-03-16 Thu 17:29] => 0:38
-
+****** TODO Make functions receive arguments
+ CLOCK: [2017-03-16 Thu 17:31]
+
+ - Work on bison file to get the parameters correctly
+ - Work on storing them correctly in the binding
***** TODO Comment code
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();
+ }
+}