From 29e14641689d404aafb1674fcc3eada076e7f5c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Grodzi=C5=84ski?= Date: Mon, 9 Jun 2025 19:08:03 +0900 Subject: [PATCH] Init and store var --- src/ModuleBuilder.cpp | 11 ++++++++++- src/ModuleBuilder.h | 1 + src/Parser.cpp | 2 +- src/main.cpp | 6 +++--- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/ModuleBuilder.cpp b/src/ModuleBuilder.cpp index 7e399b8..c1adf9e 100644 --- a/src/ModuleBuilder.cpp +++ b/src/ModuleBuilder.cpp @@ -23,6 +23,9 @@ void ModuleBuilder::buildStatement(shared_ptr statement) { case StatementKind::FUNCTION_DECLARATION: buildFunctionDeclaration(dynamic_pointer_cast(statement)); break; + case StatementKind::VAR_DECLARATION: + buildVarDeclaration(dynamic_pointer_cast(statement)); + break; case StatementKind::BLOCK: buildBlock(dynamic_pointer_cast(statement)); break; @@ -45,6 +48,12 @@ void ModuleBuilder::buildFunctionDeclaration(shared_ptrgetStatementBlock()); } +void ModuleBuilder::buildVarDeclaration(shared_ptr statement) { + llvm::Value *value = valueForExpression(statement->getExpression()); + llvm::AllocaInst *alloca = builder->CreateAlloca(typeForValueType(statement->getValueType()), nullptr, statement->getName()); + builder->CreateStore(value, alloca); +} + void ModuleBuilder::buildBlock(shared_ptr statement) { for (shared_ptr &innerStatement : statement->getStatements()) { buildStatement(innerStatement); @@ -99,7 +108,7 @@ llvm::Value *ModuleBuilder::valueForGrouping(shared_ptr expr } llvm::Value *ModuleBuilder::valueForBinary(shared_ptr expression) { - switch (expression->getValueType()) { + switch (expression->getLeft()->getValueType()) { case ValueType::BOOL: return valueForBinaryBool(expression); case ValueType::SINT32: diff --git a/src/ModuleBuilder.h b/src/ModuleBuilder.h index bc16b83..fa34581 100644 --- a/src/ModuleBuilder.h +++ b/src/ModuleBuilder.h @@ -27,6 +27,7 @@ private: void buildStatement(shared_ptr statement); void buildFunctionDeclaration(shared_ptr statement); + void buildVarDeclaration(shared_ptr statement); void buildBlock(shared_ptr statement); void buildReturn(shared_ptr statement); void buildExpression(shared_ptr statement); diff --git a/src/Parser.cpp b/src/Parser.cpp index 4aa768c..5acccd9 100644 --- a/src/Parser.cpp +++ b/src/Parser.cpp @@ -333,7 +333,7 @@ shared_ptr Parser::matchExpressionIfElse() { else if (!thenBlock->isValid()) return matchExpressionInvalid(); // FIXME - // Match else blcok + // Match else block shared_ptr elseBlock; if (tokens.at(currentIndex)->getKind() == TokenKind::COLON) { diff --git a/src/main.cpp b/src/main.cpp index 13fbb63..a4aad53 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -51,9 +51,9 @@ int main(int argc, char **argv) { } cout << endl << endl; - //ModuleBuilder moduleBuilder(statements); - //shared_ptr module = moduleBuilder.getModule(); - //module->print(llvm::outs(), nullptr); + ModuleBuilder moduleBuilder(statements); + shared_ptr module = moduleBuilder.getModule(); + module->print(llvm::outs(), nullptr); //CodeGenerator codeGenerator(module); //codeGenerator.generateObjectFile("dummy.s");