From b980fd8753cd26cf59001cd97fc11310503d1b3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Grodzi=C5=84ski?= Date: Tue, 8 Jul 2025 18:49:39 +0900 Subject: [PATCH] Working array init --- src/Compiler/ModuleBuilder.cpp | 59 ++++++++++++++++++++++------------ src/Compiler/ModuleBuilder.h | 3 +- src/Parser/ValueType.cpp | 8 ++++- 3 files changed, 47 insertions(+), 23 deletions(-) diff --git a/src/Compiler/ModuleBuilder.cpp b/src/Compiler/ModuleBuilder.cpp index b438225..defeae3 100644 --- a/src/Compiler/ModuleBuilder.cpp +++ b/src/Compiler/ModuleBuilder.cpp @@ -127,27 +127,27 @@ void ModuleBuilder::buildFunctionDeclaration(shared_ptr state } void ModuleBuilder::buildVarDeclaration(shared_ptr statement) { - llvm::Value *value = valueForExpression(statement->getExpression()); - llvm::AllocaInst *alloca = builder->CreateAlloca(typeForValueType(statement->getValueType()), nullptr, statement->getName()); + if (statement->getValueType()->getKind() == ValueTypeKind::DATA) { + vector values = valuesForExpression(statement->getExpression()); - if (!setAlloca(statement->getName(), alloca)) - return; - builder->CreateStore(value, alloca); + llvm::ArrayType *type = (llvm::ArrayType *)typeForValueType(statement->getValueType(), values.size()); + llvm::AllocaInst *alloca = builder->CreateAlloca(type, nullptr, statement->getName()); + for (int i=0; i < type->getNumElements(); i++) { + llvm::Value *index[] = { + builder->getInt32(0), + builder->getInt32(i) + }; + llvm::Value *elementPtr = builder->CreateGEP(type, alloca, index, format("{}_{}", statement->getName(), i)); + builder->CreateStore(values[i], elementPtr); + } + } else { + llvm::Value *value = valueForExpression(statement->getExpression()); + llvm::AllocaInst *alloca = builder->CreateAlloca(typeForValueType(statement->getValueType(), 0), nullptr, statement->getName()); - /*auto *aType = llvm::ArrayType::get(typeSint32, 7); - llvm::AllocaInst *allocaArr = builder->CreateAlloca(aType, nullptr, statement->getName() + "_Arr"); - - //llvm::AllocaInst *allocaBrr = builder->CreateAlloca(typeSint32, nullptr, statement->getName() + "_Arr"); - vector values; - auto *bType = llvm::ArrayType::get(typeSint32, 9); - for (int i=0; i<9; i++) { - llvm::Constant *cnst = llvm::ConstantInt::get(typeSint32, i, true); - values.push_back(cnst); + if (!setAlloca(statement->getName(), alloca)) + return; + builder->CreateStore(value, alloca); } - llvm::Constant *ar = (llvm::ConstantArray *)llvm::ConstantArray::get(bType, values); - //auto vAr = ar->getAggregateElement(0); - llvm::AllocaInst *arAlloca = builder->CreateAlloca(bType, nullptr, "arBtype"); - builder->CreateStore(ar, arAlloca);*/ } void ModuleBuilder::buildArrayDeclaration(shared_ptr statement) { @@ -254,8 +254,7 @@ llvm::Value *ModuleBuilder::valueForExpression(shared_ptr expression switch (expression->getKind()) { case ExpressionKind::LITERAL: return valueForLiteral(dynamic_pointer_cast(expression)); - case ExpressionKind::ARRAY_LITERAL: - return nullptr;// valuesForArrayLiteral(dynamic_pointer_cast(expression)); + case ExpressionKind::GROUPING: return valueForExpression(dynamic_pointer_cast(expression)->getExpression()); case ExpressionKind::BINARY: @@ -272,6 +271,16 @@ llvm::Value *ModuleBuilder::valueForExpression(shared_ptr expression } } +vector ModuleBuilder::valuesForExpression(shared_ptr expression) { + switch (expression->getKind()) { + case ExpressionKind::ARRAY_LITERAL: + return valuesForArrayLiteral(dynamic_pointer_cast(expression)); + default: + markError(0, 0, "Unexpected expression"); + return vector(); + } +} + llvm::Value *ModuleBuilder::valueForLiteral(shared_ptr expression) { if (expression->getValueType() == nullptr) return llvm::UndefValue::get(typeVoid); @@ -505,7 +514,7 @@ llvm::Function* ModuleBuilder::getFun(string name) { return nullptr; } -llvm::Type *ModuleBuilder::typeForValueType(shared_ptr valueType) { +llvm::Type *ModuleBuilder::typeForValueType(shared_ptr valueType, int count) { switch (valueType->getKind()) { case ValueTypeKind::NONE: return typeVoid; @@ -515,6 +524,14 @@ llvm::Type *ModuleBuilder::typeForValueType(shared_ptr valueType) { return typeSint32; case ValueTypeKind::REAL32: return typeReal32; + case ValueTypeKind::DATA: { + if (valueType->getSubType() == nullptr) + return nullptr; + if (valueType->getValueArg() > 0) + count = valueType->getValueArg(); + return llvm::ArrayType::get(typeForValueType(valueType->getSubType(), count), count); + return nullptr; + } } } diff --git a/src/Compiler/ModuleBuilder.h b/src/Compiler/ModuleBuilder.h index 76e724c..4550822 100644 --- a/src/Compiler/ModuleBuilder.h +++ b/src/Compiler/ModuleBuilder.h @@ -71,6 +71,7 @@ private: void buildExpression(shared_ptr statement); llvm::Value *valueForExpression(shared_ptr expression); + vector valuesForExpression(shared_ptr expression); llvm::Value *valueForLiteral(shared_ptr expression); vector valuesForArrayLiteral(shared_ptr expression); llvm::Value *valueForGrouping(shared_ptr expression); @@ -88,7 +89,7 @@ private: bool setFun(string name, llvm::Function *fun); llvm::Function *getFun(string name); - llvm::Type *typeForValueType(shared_ptr valueType); + llvm::Type *typeForValueType(shared_ptr valueType, int count = 0); void markError(int line, int column, string message); diff --git a/src/Parser/ValueType.cpp b/src/Parser/ValueType.cpp index a5418b8..6f5945d 100644 --- a/src/Parser/ValueType.cpp +++ b/src/Parser/ValueType.cpp @@ -43,4 +43,10 @@ ValueTypeKind ValueType::getKind() { return kind; } -shared_ptr getSubType() {} \ No newline at end of file +shared_ptr ValueType::getSubType() { + return subType; +} + +int ValueType::getValueArg() { + return valueArg; +} \ No newline at end of file