From a7c5f260391da944bd0779e8ac6efb2f0f6b5a6b Mon Sep 17 00:00:00 2001 From: Yann Herklotz Date: Mon, 27 Mar 2017 02:28:29 +0100 Subject: Working even more --- c_compiler/src/bindings.cpp | 49 ++++++++----- c_compiler/src/c_lexer.flex | 13 +++- c_compiler/src/c_parser.y | 8 ++- c_compiler/src/compiler_main.cpp | 2 +- c_compiler/src/declaration.cpp | 8 +-- c_compiler/src/expression.cpp | 138 +++++++++++++++++++++++++----------- c_compiler/src/function.cpp | 22 +++--- c_compiler/src/statement.cpp | 30 ++++---- c_compiler/src/translation_unit.cpp | 2 +- c_compiler/src/type.cpp | 32 ++++----- 10 files changed, 194 insertions(+), 110 deletions(-) (limited to 'c_compiler/src') diff --git a/c_compiler/src/bindings.cpp b/c_compiler/src/bindings.cpp index 24e1745..e91d408 100644 --- a/c_compiler/src/bindings.cpp +++ b/c_compiler/src/bindings.cpp @@ -1,13 +1,14 @@ #include "bindings.hpp" +std::vector Bindings::string_literals; -// VariableStackBindings definition +// Bindings definition -VariableStackBindings::VariableStackBindings() +Bindings::Bindings() : break_label_(""), continue_label_(""), stack_counter_(0), expression_stack_(16) {} -void VariableStackBindings::insertBinding(const std::string &id, TypePtr type, const int &stack_position) +void Bindings::insertBinding(const std::string &id, TypePtr type, const int &stack_position) { auto binding = bindings_.find(id); @@ -16,7 +17,7 @@ void VariableStackBindings::insertBinding(const std::string &id, TypePtr type, c DeclarationData decl_data; decl_data.type = type; decl_data.stack_position = stack_position; - bindings_.insert(std::pair(id, decl_data)); + bindings_.insert(std::make_pair(id, decl_data)); } else { @@ -25,65 +26,71 @@ void VariableStackBindings::insertBinding(const std::string &id, TypePtr type, c } } -void VariableStackBindings::increaseStackPosition() +int Bindings::insertStringLiteral(const std::string &string_literal) +{ + string_literals.push_back(string_literal); + return (int)string_literals.size()-1; +} + +void Bindings::increaseStackPosition() { stack_counter_ += 4; } -void VariableStackBindings::increaseStackPosition(const int &position) +void Bindings::increaseStackPosition(const int &position) { stack_counter_ += position; } -void VariableStackBindings::setStackPosition(const int &stack_counter) +void Bindings::setStackPosition(const int &stack_counter) { stack_counter_ = stack_counter; } -void VariableStackBindings::nextExpressionStackPosition() +void Bindings::nextExpressionStackPosition() { expression_stack_ += 4; } -void VariableStackBindings::setExpressionStackPosition(const int &stack_counter) +void Bindings::setExpressionStackPosition(const int &stack_counter) { expression_stack_ = stack_counter; } -TypePtr VariableStackBindings::getType(const std::string &id) const +TypePtr Bindings::getType(const std::string &id) const { auto binding = bindings_.find(id); return (*binding).second.type; } -std::string VariableStackBindings::breakLabel() +std::string Bindings::breakLabel() { return break_label_; } -std::string VariableStackBindings::breakLabel(const std::string &label) +std::string Bindings::breakLabel(const std::string &label) { break_label_ = label; return break_label_; } -std::string VariableStackBindings::continueLabel() +std::string Bindings::continueLabel() { return continue_label_; } -std::string VariableStackBindings::continueLabel(const std::string &label) +std::string Bindings::continueLabel(const std::string &label) { continue_label_ = label; return continue_label_; } -int VariableStackBindings::currentStackPosition() const +int Bindings::currentStackPosition() const { return stack_counter_; } -int VariableStackBindings::stackPosition(const std::string &id) const +int Bindings::stackPosition(const std::string &id) const { auto binding = bindings_.find(id); @@ -93,12 +100,18 @@ int VariableStackBindings::stackPosition(const std::string &id) const else return 0; } -int VariableStackBindings::currentExpressionStackPosition() const +int Bindings::currentExpressionStackPosition() const { return expression_stack_; } -bool VariableStackBindings::bindingExists(const std::string &id) const +std::pair::const_iterator, std::vector::const_iterator> +Bindings::getStringLiteralIterator() const +{ + return std::make_pair(string_literals.begin(), string_literals.end()); +} + +bool Bindings::bindingExists(const std::string &id) const { auto binding = bindings_.find(id); diff --git a/c_compiler/src/c_lexer.flex b/c_compiler/src/c_lexer.flex index 8dcef35..8365a5b 100644 --- a/c_compiler/src/c_lexer.flex +++ b/c_compiler/src/c_lexer.flex @@ -16,9 +16,9 @@ DECIMALCONSTANT ([1-9][0-9]*) OCTALCONSTANT ([0][0-7]*) HEXCONSTANT ([0][xX][0-9A-Fa-f]+) -CHARCONSTANT ('(([\\]['])|([^']))+') +CHARCONSTANT (['](([\\]['])|([^']))*[']) -STRINGLITERAL ["](([\\]["])|([^"]))*["] +STRINGLITERAL (["](([\\]["])|([^"]))*["]) WHITESPACE [ \t\r\n]+ @@ -54,6 +54,15 @@ ALL . (default) { return T_DEFAULT; } (switch) { return T_SWITCH; } +{STRINGLITERAL} { std::string tmp(yytext); yylval.string = new std::string(tmp.substr(1, yyleng-2)); + return T_STRINGLITERAL; } +L{STRINGLITERAL} { std::string tmp(yytext); yylval.string = new std::string(tmp.substr(2, yyleng-3)); + return T_STRINGLITERAL;} + +{CHARCONSTANT} { yylval.number = yytext[1]; return T_INT_CONST; } +L{CHARCONSTANT} { yylval.number = yytext[2]; return T_INT_CONST; } + + [.][.][.] { return T_ELLIPSIS; } [;] { return T_SC; } [,] { return T_CMA; } diff --git a/c_compiler/src/c_parser.y b/c_compiler/src/c_parser.y index 2c5d215..81293ba 100644 --- a/c_compiler/src/c_parser.y +++ b/c_compiler/src/c_parser.y @@ -41,7 +41,7 @@ void yyerror(const char *); T_VOID T_CHAR T_SHORT T_INT T_LONG T_FLOAT T_DOUBLE T_SIGNED T_UNSIGNED T_TYPEDEF T_EXTERN T_STATIC T_AUTO T_REGISTER T_CONST T_VOLATILE T_GOTO T_BREAK T_CONTINUE - T_CASE T_DEFAULT T_SWITCH T_ELLIPSIS + T_CASE T_DEFAULT T_SWITCH T_ELLIPSIS T_STRINGLITERAL %nonassoc T_RRB %nonassoc T_ELSE @@ -74,8 +74,9 @@ void yyerror(const char *); %type T_INT_CONST %type T_IDENTIFIER ASSIGN_OPER T_ASSIGN_OPER T_EQ T_AND T_ADDSUB_OP T_TILDE T_NOT - T_MULT T_DIV T_REM T_EQUALITY_OP T_REL_OP T_SHIFT_OP T_INCDEC MultDivRemOP - UnaryOperator DeclarationSpecifier TypeQualifier TypeQualifierList + T_MULT T_DIV T_REM T_EQUALITY_OP T_REL_OP T_SHIFT_OP T_INCDEC T_STRINGLITERAL + MultDivRemOP UnaryOperator DeclarationSpecifier TypeQualifier + TypeQualifierList %start ROOT @@ -467,6 +468,7 @@ ArgumentExpressionList: PrimaryExpression: T_IDENTIFIER { $$ = new Identifier(*$1); delete $1; } | Constant { $$ = $1; } + | T_STRINGLITERAL { $$ = new StringLiteral(*$1); delete $1; } | T_LRB Expression T_RRB { $$ = $2; } ; diff --git a/c_compiler/src/compiler_main.cpp b/c_compiler/src/compiler_main.cpp index dc2fc17..4ed3bff 100644 --- a/c_compiler/src/compiler_main.cpp +++ b/c_compiler/src/compiler_main.cpp @@ -11,7 +11,7 @@ int main(int, char**) try { std::unique_ptr ast(parseAST()); - VariableStackBindings bindings; + Bindings bindings; int label_count = 0; ast->printAsm(bindings, label_count); } diff --git a/c_compiler/src/declaration.cpp b/c_compiler/src/declaration.cpp index a3ee5d3..594c91b 100644 --- a/c_compiler/src/declaration.cpp +++ b/c_compiler/src/declaration.cpp @@ -38,7 +38,7 @@ void Declaration::printXml() const printf("", id_.c_str()); } -VariableStackBindings Declaration::printAsm(VariableStackBindings bindings, int& label_count) const +Bindings Declaration::printAsm(Bindings bindings, int& label_count) const { (void)label_count; if(!extern_declaration_) @@ -54,7 +54,7 @@ VariableStackBindings Declaration::printAsm(VariableStackBindings bindings, int& return bindings; } -VariableStackBindings Declaration::localAsm(VariableStackBindings bindings, int& label_count) const +Bindings Declaration::localAsm(Bindings bindings, int& label_count) const { if(next_declaration_ != nullptr) bindings = next_declaration_->localAsm(bindings, label_count); @@ -148,12 +148,12 @@ ArrayDeclaration::ArrayDeclaration(const std::string &id, ExpressionPtr initiali : Declaration(id, initializer), size_(size) {} -VariableStackBindings ArrayDeclaration::printAsm(VariableStackBindings bindings, int &label_count) const +Bindings ArrayDeclaration::printAsm(Bindings bindings, int &label_count) const { return bindings; } -VariableStackBindings ArrayDeclaration::localAsm(VariableStackBindings bindings, int &label_count) const +Bindings ArrayDeclaration::localAsm(Bindings bindings, int &label_count) const { if(next_declaration_ != nullptr) bindings = next_declaration_->localAsm(bindings, label_count); diff --git a/c_compiler/src/expression.cpp b/c_compiler/src/expression.cpp index 466d8f7..8d2e7cf 100644 --- a/c_compiler/src/expression.cpp +++ b/c_compiler/src/expression.cpp @@ -39,7 +39,7 @@ std::string Expression::id() const return ""; } -TypePtr Expression::getType(const VariableStackBindings &) const +TypePtr Expression::getType(const Bindings &) const { // by default return largest size, which is 32 bits return std::make_shared(); @@ -86,7 +86,7 @@ void OperationExpression::expressionDepth(int &depth_count) const depth_count = rhs_depth_count; } -TypePtr OperationExpression::getType(const VariableStackBindings &bindings) const +TypePtr OperationExpression::getType(const Bindings &bindings) const { return lhs_->getType(bindings); } @@ -101,7 +101,7 @@ ExpressionPtr OperationExpression::getRhs() const return rhs_; } -void OperationExpression::evaluateExpression(VariableStackBindings bindings, int &label_count) const +void OperationExpression::evaluateExpression(Bindings bindings, int &label_count) const { // I can just evaluate the lhs with the same entry stack position lhs_->printAsm(bindings, label_count); @@ -115,14 +115,24 @@ void OperationExpression::evaluateExpression(VariableStackBindings bindings, int // now I have them evaluated at two positions in the stack and can load both into registers // $2 and $3 - lhs_->getType(bindings)->load(2, lhs_stack_position); + printf("\tlw\t$2,%d($fp)\n", lhs_stack_position); printf("\tlw\t$3,%d($fp)\n", bindings.currentExpressionStackPosition()); } // Unary expression definition -void UnaryExpression::stackPosition(VariableStackBindings, int &) const +void UnaryExpression::expressionDepth(int &depth_count) const +{ + ++depth_count; +} + +void UnaryExpression::pointerPosition(Bindings bindings) const +{ + throw std::runtime_error("Error : Cannot get pointer position"); +} + +void UnaryExpression::stackPosition(Bindings, int &) const { throw std::runtime_error("Error : Cannot get stack position of expression"); } @@ -134,7 +144,7 @@ PostfixArrayElement::PostfixArrayElement(Expression *postfix_expression, Express : postfix_expression_(postfix_expression), index_expression_(index_expression) {} -VariableStackBindings PostfixArrayElement::printAsm(VariableStackBindings bindings, int &label_count) const +Bindings PostfixArrayElement::printAsm(Bindings bindings, int &label_count) const { stackPosition(bindings, label_count); TypePtr type_ptr = postfix_expression_->getType(bindings); @@ -148,7 +158,7 @@ VariableStackBindings PostfixArrayElement::printAsm(VariableStackBindings bindin return bindings; } -void PostfixArrayElement::stackPosition(VariableStackBindings bindings, int &label_count) const +void PostfixArrayElement::stackPosition(Bindings bindings, int &label_count) const { index_expression_->printAsm(bindings, label_count); @@ -169,7 +179,7 @@ void PostfixArrayElement::expressionDepth(int &depth_count) const index_expression_->expressionDepth(depth_count); } -TypePtr PostfixArrayElement::getType(const VariableStackBindings &bindings) const +TypePtr PostfixArrayElement::getType(const Bindings &bindings) const { return postfix_expression_->getType(bindings); } @@ -181,7 +191,7 @@ PostfixFunctionCall::PostfixFunctionCall(Expression *argument_expression_list) : argument_expression_list_(argument_expression_list) {} -VariableStackBindings PostfixFunctionCall::printAsm(VariableStackBindings bindings, int &label_count) const +Bindings PostfixFunctionCall::printAsm(Bindings bindings, int &label_count) const { std::vector argument_vector; ExpressionPtr current_argument = argument_expression_list_; @@ -235,7 +245,7 @@ void PostfixFunctionCall::expressionDepth(int &depth_count) const argument_expression_list_->expressionDepth(depth_count); } -TypePtr PostfixFunctionCall::getType(const VariableStackBindings &) const +TypePtr PostfixFunctionCall::getType(const Bindings &) const { return std::make_shared(); } @@ -247,7 +257,7 @@ PostfixPostIncDecExpression::PostfixPostIncDecExpression(const std::string &_ope : operator_(_operator), postfix_expression_(postfix_expression) {} -VariableStackBindings PostfixPostIncDecExpression::printAsm(VariableStackBindings bindings, int &label_count) const +Bindings PostfixPostIncDecExpression::printAsm(Bindings bindings, int &label_count) const { postfix_expression_->printAsm(bindings, label_count); if(operator_ == "++") @@ -279,7 +289,7 @@ VariableStackBindings PostfixPostIncDecExpression::printAsm(VariableStackBinding return bindings; } -TypePtr PostfixPostIncDecExpression::getType(const VariableStackBindings &bindings) const +TypePtr PostfixPostIncDecExpression::getType(const Bindings &bindings) const { return postfix_expression_->getType(bindings); } @@ -291,7 +301,7 @@ UnaryPreIncDecExpression::UnaryPreIncDecExpression(const std::string &_operator, : operator_(_operator), unary_expression_(unary_expression) {} -VariableStackBindings UnaryPreIncDecExpression::printAsm(VariableStackBindings bindings, int &label_count) const +Bindings UnaryPreIncDecExpression::printAsm(Bindings bindings, int &label_count) const { unary_expression_->printAsm(bindings, label_count); if(operator_ == "++") @@ -310,7 +320,7 @@ VariableStackBindings UnaryPreIncDecExpression::printAsm(VariableStackBindings b return bindings; } -TypePtr UnaryPreIncDecExpression::getType(const VariableStackBindings &bindings) const +TypePtr UnaryPreIncDecExpression::getType(const Bindings &bindings) const { return unary_expression_->getType(bindings); } @@ -322,7 +332,7 @@ OperatorUnaryExpression::OperatorUnaryExpression(const std::string &_operator, E : operator_(_operator), cast_expression_(cast_expression) {} -VariableStackBindings OperatorUnaryExpression::printAsm(VariableStackBindings bindings, int &label_count) const +Bindings OperatorUnaryExpression::printAsm(Bindings bindings, int &label_count) const { cast_expression_->printAsm(bindings, label_count); if(operator_ == "!") @@ -354,7 +364,7 @@ VariableStackBindings OperatorUnaryExpression::printAsm(VariableStackBindings bi return bindings; } -void OperatorUnaryExpression::stackPosition(VariableStackBindings bindings, int &label_count) const +void OperatorUnaryExpression::stackPosition(Bindings bindings, int &label_count) const { if(operator_ == "*") { @@ -364,7 +374,7 @@ void OperatorUnaryExpression::stackPosition(VariableStackBindings bindings, int } } -TypePtr OperatorUnaryExpression::getType(const VariableStackBindings &bindings) const +TypePtr OperatorUnaryExpression::getType(const Bindings &bindings) const { return cast_expression_->getType(bindings); } @@ -376,7 +386,7 @@ CastExpression::CastExpression(Type *type, Expression *expression) : type_(type), expression_(expression) {} -VariableStackBindings CastExpression::printAsm(VariableStackBindings bindings, int &label_count) const +Bindings CastExpression::printAsm(Bindings bindings, int &label_count) const { return bindings; } @@ -389,7 +399,7 @@ void CastExpression::expressionDepth(int &depth_count) const expression_->expressionDepth(depth_count); } -TypePtr CastExpression::getType(const VariableStackBindings &) const +TypePtr CastExpression::getType(const Bindings &) const { return type_; } @@ -401,7 +411,7 @@ AdditiveExpression::AdditiveExpression(Expression *lhs, const std::string &_oper : OperationExpression(lhs, rhs), operator_(_operator) {} -VariableStackBindings AdditiveExpression::printAsm(VariableStackBindings bindings, int &label_count) const +Bindings AdditiveExpression::printAsm(Bindings bindings, int &label_count) const { evaluateExpression(bindings, label_count); @@ -435,7 +445,7 @@ MultiplicativeExpression::MultiplicativeExpression(Expression *lhs, const std::s : OperationExpression(lhs, rhs), operator_(_operator) {} -VariableStackBindings MultiplicativeExpression::printAsm(VariableStackBindings bindings, int &label_count) const +Bindings MultiplicativeExpression::printAsm(Bindings bindings, int &label_count) const { evaluateExpression(bindings, label_count); @@ -480,7 +490,7 @@ ShiftExpression::ShiftExpression(Expression* lhs, const std::string &_operator, : OperationExpression(lhs, rhs), operator_(_operator) {} -VariableStackBindings ShiftExpression::printAsm(VariableStackBindings bindings, int &label_count) const +Bindings ShiftExpression::printAsm(Bindings bindings, int &label_count) const { evaluateExpression(bindings, label_count); @@ -516,7 +526,7 @@ RelationalExpression::RelationalExpression(Expression* lhs, const std::string &_ : OperationExpression(lhs, rhs), operator_(_operator) {} -VariableStackBindings RelationalExpression::printAsm(VariableStackBindings bindings, int &label_count) const +Bindings RelationalExpression::printAsm(Bindings bindings, int &label_count) const { evaluateExpression(bindings, label_count); @@ -571,7 +581,7 @@ EqualityExpression::EqualityExpression(Expression *lhs, const std::string &_oper : OperationExpression(lhs, rhs), operator_(_operator) {} -VariableStackBindings EqualityExpression::printAsm(VariableStackBindings bindings, int &label_count) const +Bindings EqualityExpression::printAsm(Bindings bindings, int &label_count) const { evaluateExpression(bindings, label_count); printf("\txor\t$2,$2,$3\n"); @@ -608,7 +618,7 @@ AndExpression::AndExpression(Expression *lhs, Expression *rhs) : OperationExpression(lhs, rhs) {} -VariableStackBindings AndExpression::printAsm(VariableStackBindings bindings, int &label_count) const +Bindings AndExpression::printAsm(Bindings bindings, int &label_count) const { evaluateExpression(bindings, label_count); printf("\tand\t$2,$2,$3\n\tsw\t$2,%d($fp)\n", bindings.currentExpressionStackPosition()); @@ -627,7 +637,7 @@ ExclusiveOrExpression::ExclusiveOrExpression(Expression *lhs, Expression *rhs) : OperationExpression(lhs, rhs) {} -VariableStackBindings ExclusiveOrExpression::printAsm(VariableStackBindings bindings, int &label_count) const +Bindings ExclusiveOrExpression::printAsm(Bindings bindings, int &label_count) const { evaluateExpression(bindings, label_count); printf("\txor\t$2,$2,$3\n\tsw\t$2,%d($fp)\n", bindings.currentExpressionStackPosition()); @@ -646,7 +656,7 @@ InclusiveOrExpression::InclusiveOrExpression(Expression *lhs, Expression *rhs) : OperationExpression(lhs, rhs) {} -VariableStackBindings InclusiveOrExpression::printAsm(VariableStackBindings bindings, int &label_count) const +Bindings InclusiveOrExpression::printAsm(Bindings bindings, int &label_count) const { evaluateExpression(bindings, label_count); printf("\tor\t$2,$2,$3\n\tsw\t$2,%d($fp)\n", bindings.currentExpressionStackPosition()); @@ -665,7 +675,7 @@ LogicalAndExpression::LogicalAndExpression(Expression *lhs, Expression *rhs) : OperationExpression(lhs, rhs) {} -VariableStackBindings LogicalAndExpression::printAsm(VariableStackBindings bindings, int &label_count) const +Bindings LogicalAndExpression::printAsm(Bindings bindings, int &label_count) const { int log_and = label_count++; lhs_->printAsm(bindings, label_count); @@ -690,7 +700,7 @@ LogicalOrExpression::LogicalOrExpression(Expression *lhs, Expression *rhs) : OperationExpression(lhs, rhs) {} -VariableStackBindings LogicalOrExpression::printAsm(VariableStackBindings bindings, int &label_count) const +Bindings LogicalOrExpression::printAsm(Bindings bindings, int &label_count) const { int log_or = label_count++; lhs_->printAsm(bindings, label_count); @@ -718,12 +728,12 @@ ConditionalExpression::ConditionalExpression(Expression *logical_or, conditional_expression_(conditional_expression) {} -VariableStackBindings ConditionalExpression::printAsm(VariableStackBindings bindings, int &label_count) const +Bindings ConditionalExpression::printAsm(Bindings bindings, int &label_count) const { return bindings; } -TypePtr ConditionalExpression::getType(const VariableStackBindings &bindings) const +TypePtr ConditionalExpression::getType(const Bindings &bindings) const { return std::make_shared(); } @@ -739,7 +749,7 @@ AssignmentExpression::AssignmentExpression(ExpressionPtr lhs, Expression *rhs) : OperationExpression(lhs, rhs) {} -VariableStackBindings AssignmentExpression::printAsm(VariableStackBindings bindings, int &label_count) const +Bindings AssignmentExpression::printAsm(Bindings bindings, int &label_count) const { // TODO add stack and store results in there, also for addition and multiplication. @@ -754,17 +764,28 @@ VariableStackBindings AssignmentExpression::printAsm(VariableStackBindings bindi // don't have to change the stack position as there is no lhs to evaluate rhs_->printAsm(bindings, label_count); bindings.nextExpressionStackPosition(); - + + std::shared_ptr rhs_tmp; + rhs_tmp = std::dynamic_pointer_cast(rhs_); + // we are assigning so we don't have to evaluate the lhs as it will be overwritten anyways - lhs_postfix->stackPosition(bindings, label_count); + if(rhs_tmp != nullptr) + { + lhs_postfix->pointerPosition(bindings); + } + else + { + lhs_postfix->stackPosition(bindings, label_count); + } // now the result of the rhs will be in that stack position, so we can load it into $2 + printf("\tlw\t$2,%d($fp)\n", expression_stack_position); + TypePtr lhs_type = lhs_->getType(bindings); - lhs_type->load(2, expression_stack_position); - // check if lhs is trying to access an array std::shared_ptr lhs_tmp; lhs_tmp = std::dynamic_pointer_cast(lhs_); + if(lhs_tmp != nullptr) { std::shared_ptr lhs_pointer_type; @@ -793,7 +814,7 @@ Identifier::Identifier(const std::string &id) : id_(id) {} -VariableStackBindings Identifier::printAsm(VariableStackBindings bindings, int &) const +Bindings Identifier::printAsm(Bindings bindings, int &) const { if(bindings.bindingExists(id_)) { @@ -824,12 +845,23 @@ VariableStackBindings Identifier::printAsm(VariableStackBindings bindings, int & return bindings; } -void Identifier::stackPosition(VariableStackBindings bindings, int &) const +void Identifier::pointerPosition(Bindings bindings) const +{ + if(bindings.bindingExists(id_)) + { + printf("\taddiu\t$t0,$fp,%d\n", bindings.stackPosition(id_)); + return; + } + + throw std::runtime_error("Error : '"+id_+"' not yet declared"); +} + +void Identifier::stackPosition(Bindings bindings, int &) const { if(bindings.bindingExists(id_)) { if(std::dynamic_pointer_cast(bindings.getType(id_)) != nullptr) - printf("\tlw\t$3,%d($fp)\n\tmove\t$t0,$3\n", bindings.stackPosition(id_)); + printf("\tlw\t$t0,%d($fp)\n", bindings.stackPosition(id_)); else printf("\taddiu\t$t0,$fp,%d\n", bindings.stackPosition(id_)); return; @@ -843,19 +875,41 @@ std::string Identifier::id() const return id_; } -TypePtr Identifier::getType(const VariableStackBindings &bindings) const +TypePtr Identifier::getType(const Bindings &bindings) const { return bindings.getType(id_); } +// String literal definition + +StringLiteral::StringLiteral(const std::string &string_content) + : string_content_(string_content) +{} + +Bindings StringLiteral::printAsm(Bindings bindings, int &) const +{ + int label = bindings.insertStringLiteral(string_content_); + printf("\tlui\t$2,%%hi($%d_string)\n\taddiu\t$2,$2,%%lo($%d_string)\n", label, label); + printf("\tsw\t$2,%d($fp)\n", bindings.currentExpressionStackPosition()); + return bindings; +} + +TypePtr StringLiteral::getType(const Bindings &) const +{ + std::shared_ptr tmp_pointer_ptr; + tmp_pointer_ptr->type(std::make_shared()); + return tmp_pointer_ptr; +} + + // Constant definition Constant::Constant(const int32_t &constant) : constant_(constant) {} -VariableStackBindings Constant::printAsm(VariableStackBindings bindings, int &) const +Bindings Constant::printAsm(Bindings bindings, int &) const { // constant only has to load to $2 because the other expression will take care of the rest printf("\tli\t$2,%d\n", constant_); @@ -868,7 +922,7 @@ int Constant::constantFold() const return constant_; } -TypePtr Constant::getType(const VariableStackBindings &) const +TypePtr Constant::getType(const Bindings &) const { return std::make_shared(); } diff --git a/c_compiler/src/function.cpp b/c_compiler/src/function.cpp index 8ce3be0..5cdb33d 100644 --- a/c_compiler/src/function.cpp +++ b/c_compiler/src/function.cpp @@ -47,9 +47,9 @@ void Function::printXml() const printf("\n"); } -VariableStackBindings Function::printAsm(VariableStackBindings bindings, int& label_count) const +Bindings Function::printAsm(Bindings bindings, int& label_count) const { - VariableStackBindings original_bindings = bindings; + Bindings original_bindings = bindings; // Counting all the variables being declared in the function int variable_count = 0; if(statement_ != nullptr) @@ -71,11 +71,7 @@ VariableStackBindings Function::printAsm(VariableStackBindings bindings, int& la // This adds 2 to store the frame pointer and the return address int memory_needed = 4*(variable_count+max_argument_count+max_depth+2); - // make frame double word aligned - if(memory_needed % 8 != 0) - memory_needed += 4; - - printf("\t.text\n\t.globl\t%s\n%s:\n\taddiu\t$sp,$sp,-%d\n\tsw\t", + printf("\t.text\n\t.align\t2\n\t.globl\t%s\n%s:\n\taddiu\t$sp,$sp,-%d\n\tsw\t", id_.c_str(), id_.c_str(), memory_needed); printf("$31,%d($sp)\n\tsw\t$fp,%d($sp)\n\tmove\t$fp,$sp\n", memory_needed-4, memory_needed-8); @@ -91,10 +87,20 @@ VariableStackBindings Function::printAsm(VariableStackBindings bindings, int& la printf("\tmove\t$2,$0\n0:\n\tmove\t$sp,$fp\n\tlw\t$31,%d($sp)\n\tlw\t$fp,%d", memory_needed-4, memory_needed-8); printf("($sp)\n\taddiu\t$sp,$sp,%d\n\tjr\t$31\n\tnop\n", memory_needed); + auto string_lit_iterator = bindings.getStringLiteralIterator(); + if(string_lit_iterator.first != string_lit_iterator.second) + { + printf("\n\t.rdata\n\t.align\t2\n"); + for(auto itr = string_lit_iterator.first; itr != string_lit_iterator.second; ++itr) + { + printf("$%d_string:\n\t.ascii\t\"%s\\000\"", int(itr-string_lit_iterator.first), (*itr).c_str()); + } + } + return original_bindings; } -void Function::printParameterAsm(VariableStackBindings& bindings, int& frame_offset) const +void Function::printParameterAsm(Bindings& bindings, int& frame_offset) const { std::vector parameter_vector; DeclarationPtr parameter_list = parameter_list_; diff --git a/c_compiler/src/statement.cpp b/c_compiler/src/statement.cpp index 0b871e8..309e2d8 100644 --- a/c_compiler/src/statement.cpp +++ b/c_compiler/src/statement.cpp @@ -58,7 +58,7 @@ void LabelStatement::printXml() const next_statement_->printXml(); } -VariableStackBindings LabelStatement::printAsm(VariableStackBindings bindings, int &label_count) const +Bindings LabelStatement::printAsm(Bindings bindings, int &label_count) const { if(next_statement_ != nullptr) next_statement_->printAsm(bindings, label_count); @@ -123,7 +123,7 @@ void CaseStatement::printXml() const next_statement_->printXml(); } -VariableStackBindings CaseStatement::printAsm(VariableStackBindings bindings, int &label_count) const +Bindings CaseStatement::printAsm(Bindings bindings, int &label_count) const { if(next_statement_ != nullptr) next_statement_->printAsm(bindings, label_count); @@ -216,9 +216,9 @@ void CompoundStatement::printXml() const printf("\n"); } -VariableStackBindings CompoundStatement::printAsm(VariableStackBindings bindings, int &label_count) const +Bindings CompoundStatement::printAsm(Bindings bindings, int &label_count) const { - VariableStackBindings outer_scope_bindings = bindings; + Bindings outer_scope_bindings = bindings; if(next_statement_ != nullptr) next_statement_->printAsm(bindings, label_count); @@ -303,7 +303,7 @@ void IfElseStatement::printXml() const else_->printXml(); } -VariableStackBindings IfElseStatement::printAsm(VariableStackBindings bindings, int &label_count) const +Bindings IfElseStatement::printAsm(Bindings bindings, int &label_count) const { if(next_statement_ != nullptr) next_statement_->printAsm(bindings, label_count); @@ -406,7 +406,7 @@ void SwitchStatement::printXml() const statement_->printXml(); } -VariableStackBindings SwitchStatement::printAsm(VariableStackBindings bindings, int &label_count) const +Bindings SwitchStatement::printAsm(Bindings bindings, int &label_count) const { int switch_count = label_count++; std::shared_ptr comp_statement; @@ -533,7 +533,7 @@ void ExpressionStatement::printXml() const next_statement_->printXml(); } -VariableStackBindings ExpressionStatement::printAsm(VariableStackBindings bindings, int &label_count) const +Bindings ExpressionStatement::printAsm(Bindings bindings, int &label_count) const { if(next_statement_ != nullptr) next_statement_->printAsm(bindings, label_count); @@ -622,7 +622,7 @@ ReturnStatement::ReturnStatement(Expression *expression) : expression_(expression) {} -VariableStackBindings ReturnStatement::printAsm(VariableStackBindings bindings, int &label_count) const +Bindings ReturnStatement::printAsm(Bindings bindings, int &label_count) const { if(next_statement_ != nullptr) next_statement_->printAsm(bindings, label_count); @@ -682,7 +682,7 @@ void ReturnStatement::countExpressionDepth(int &depth_count) const BreakStatement::BreakStatement() {} -VariableStackBindings BreakStatement::printAsm(VariableStackBindings bindings, int &label_count) const +Bindings BreakStatement::printAsm(Bindings bindings, int &label_count) const { if(next_statement_ != nullptr) next_statement_->printAsm(bindings, label_count); @@ -697,7 +697,7 @@ VariableStackBindings BreakStatement::printAsm(VariableStackBindings bindings, i ContinueStatement::ContinueStatement() {} -VariableStackBindings ContinueStatement::printAsm(VariableStackBindings bindings, int &label_count) const +Bindings ContinueStatement::printAsm(Bindings bindings, int &label_count) const { if(next_statement_ != nullptr) next_statement_->printAsm(bindings, label_count); @@ -713,7 +713,7 @@ GotoStatement::GotoStatement(const std::string &label) : label_(label) {} -VariableStackBindings GotoStatement::printAsm(VariableStackBindings bindings, int &label_count) const +Bindings GotoStatement::printAsm(Bindings bindings, int &label_count) const { if(next_statement_ != nullptr) next_statement_->printAsm(bindings, label_count); @@ -789,12 +789,12 @@ WhileLoop::WhileLoop(Expression *condition, Statement *statement, const bool &is : IterationStatement(condition, statement), is_while_(is_while) {} -VariableStackBindings WhileLoop::printAsm(VariableStackBindings bindings, int &label_count) const +Bindings WhileLoop::printAsm(Bindings bindings, int &label_count) const { if(next_statement_ != nullptr) next_statement_->printAsm(bindings, label_count); - VariableStackBindings initial_bindings = bindings; + Bindings initial_bindings = bindings; int while_label = label_count++; @@ -816,12 +816,12 @@ ForLoop::ForLoop(Expression *initializer, Expression *condition, Expression *inc : IterationStatement(condition, statement), initializer_(initializer), incrementer_(incrementer) {} -VariableStackBindings ForLoop::printAsm(VariableStackBindings bindings, int &label_count) const +Bindings ForLoop::printAsm(Bindings bindings, int &label_count) const { if(next_statement_ != nullptr) next_statement_->printAsm(bindings, label_count); - VariableStackBindings initial_bindings = bindings; + Bindings initial_bindings = bindings; int for_label = label_count++; diff --git a/c_compiler/src/translation_unit.cpp b/c_compiler/src/translation_unit.cpp index 41d1171..3dd8a7b 100644 --- a/c_compiler/src/translation_unit.cpp +++ b/c_compiler/src/translation_unit.cpp @@ -25,7 +25,7 @@ void TranslationUnit::printXml() const printf("\n"); } -VariableStackBindings TranslationUnit::printAsm(VariableStackBindings bindings, int& label_count) const +Bindings TranslationUnit::printAsm(Bindings bindings, int& label_count) const { for(auto& node : translation_unit_) { bindings = node->printAsm(bindings, label_count); diff --git a/c_compiler/src/type.cpp b/c_compiler/src/type.cpp index 251ebc5..675230c 100644 --- a/c_compiler/src/type.cpp +++ b/c_compiler/src/type.cpp @@ -46,7 +46,7 @@ void Array::print() const void Array::printXml() const {} -VariableStackBindings Array::printAsm(VariableStackBindings bindings, int &) const +Bindings Array::printAsm(Bindings bindings, int &) const { return bindings; } @@ -69,7 +69,7 @@ TypePtr Array::type(TypePtr type_ptr) return type_; } -void Array::increaseStackPosition(VariableStackBindings &bindings) const +void Array::increaseStackPosition(Bindings &bindings) const { for(int i = 0; i < size_; ++i) { @@ -121,7 +121,7 @@ void Pointer::print() const void Pointer::printXml() const {} -VariableStackBindings Pointer::printAsm(VariableStackBindings bindings, int &) const +Bindings Pointer::printAsm(Bindings bindings, int &) const { return bindings; } @@ -144,7 +144,7 @@ TypePtr Pointer::type(TypePtr type_ptr) return type_; } -void Pointer::increaseStackPosition(VariableStackBindings &bindings) const +void Pointer::increaseStackPosition(Bindings &bindings) const { bindings.increaseStackPosition(4); } @@ -221,7 +221,7 @@ void TypeContainer::print() const void TypeContainer::printXml() const {} -VariableStackBindings TypeContainer::printAsm(VariableStackBindings bindings, int &) const +Bindings TypeContainer::printAsm(Bindings bindings, int &) const { return bindings; } @@ -246,7 +246,7 @@ TypePtr TypeContainer::type(TypePtr type_ptr) return type_; } -void TypeContainer::increaseStackPosition(VariableStackBindings &bindings) const +void TypeContainer::increaseStackPosition(Bindings &bindings) const { type_->increaseStackPosition(bindings); } @@ -338,12 +338,12 @@ void Int::print() const void Int::printXml() const {} -VariableStackBindings Int::printAsm(VariableStackBindings bindings, int &) const +Bindings Int::printAsm(Bindings bindings, int &) const { return bindings; } -void Int::increaseStackPosition(VariableStackBindings &bindings) const +void Int::increaseStackPosition(Bindings &bindings) const { bindings.increaseStackPosition(4); } @@ -392,12 +392,12 @@ void Void::print() const void Void::printXml() const {} -VariableStackBindings Void::printAsm(VariableStackBindings bindings, int &) const +Bindings Void::printAsm(Bindings bindings, int &) const { return bindings; } -void Void::increaseStackPosition(VariableStackBindings &) const +void Void::increaseStackPosition(Bindings &) const {} void Void::load() const @@ -434,12 +434,12 @@ void Short::print() const void Short::printXml() const {} -VariableStackBindings Short::printAsm(VariableStackBindings bindings, int &) const +Bindings Short::printAsm(Bindings bindings, int &) const { return bindings; } -void Short::increaseStackPosition(VariableStackBindings &bindings) const +void Short::increaseStackPosition(Bindings &bindings) const { bindings.increaseStackPosition(2); } @@ -488,12 +488,12 @@ void Char::print() const void Char::printXml() const {} -VariableStackBindings Char::printAsm(VariableStackBindings bindings, int &) const +Bindings Char::printAsm(Bindings bindings, int &) const { return bindings; } -void Char::increaseStackPosition(VariableStackBindings &bindings) const +void Char::increaseStackPosition(Bindings &bindings) const { bindings.increaseStackPosition(1); } @@ -542,12 +542,12 @@ void Float::print() const void Float::printXml() const {} -VariableStackBindings Float::printAsm(VariableStackBindings bindings, int &) const +Bindings Float::printAsm(Bindings bindings, int &) const { return bindings; } -void Float::increaseStackPosition(VariableStackBindings &bindings) const +void Float::increaseStackPosition(Bindings &bindings) const { bindings.increaseStackPosition(4); } -- cgit