Working array init

This commit is contained in:
Rafał Grodziński
2025-07-08 18:49:39 +09:00
parent 9e7747dcbc
commit b980fd8753
3 changed files with 47 additions and 23 deletions

View File

@@ -127,27 +127,27 @@ void ModuleBuilder::buildFunctionDeclaration(shared_ptr<StatementFunction> state
}
void ModuleBuilder::buildVarDeclaration(shared_ptr<StatementVariable> 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<llvm::Value *> 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<llvm::Constant *> 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<StatementVariable> statement) {
@@ -254,8 +254,7 @@ llvm::Value *ModuleBuilder::valueForExpression(shared_ptr<Expression> expression
switch (expression->getKind()) {
case ExpressionKind::LITERAL:
return valueForLiteral(dynamic_pointer_cast<ExpressionLiteral>(expression));
case ExpressionKind::ARRAY_LITERAL:
return nullptr;// valuesForArrayLiteral(dynamic_pointer_cast<ExpressionArrayLiteral>(expression));
case ExpressionKind::GROUPING:
return valueForExpression(dynamic_pointer_cast<ExpressionGrouping>(expression)->getExpression());
case ExpressionKind::BINARY:
@@ -272,6 +271,16 @@ llvm::Value *ModuleBuilder::valueForExpression(shared_ptr<Expression> expression
}
}
vector<llvm::Value*> ModuleBuilder::valuesForExpression(shared_ptr<Expression> expression) {
switch (expression->getKind()) {
case ExpressionKind::ARRAY_LITERAL:
return valuesForArrayLiteral(dynamic_pointer_cast<ExpressionArrayLiteral>(expression));
default:
markError(0, 0, "Unexpected expression");
return vector<llvm::Value*>();
}
}
llvm::Value *ModuleBuilder::valueForLiteral(shared_ptr<ExpressionLiteral> 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> valueType) {
llvm::Type *ModuleBuilder::typeForValueType(shared_ptr<ValueType> valueType, int count) {
switch (valueType->getKind()) {
case ValueTypeKind::NONE:
return typeVoid;
@@ -515,6 +524,14 @@ llvm::Type *ModuleBuilder::typeForValueType(shared_ptr<ValueType> 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;
}
}
}