diff --git a/src/codegen.cpp b/src/codegen.cpp index a488eb6..4182ee6 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -329,7 +329,7 @@ namespace AST { } codegen::StackValue ListInitializerExpression::codegen(codegen::Builder& builder, codegen::Scope& scope) { - auto array_ptr = builder.builder->CreateAlloca(this->m_ty->codegen(builder, scope.structs)); + auto value_ptr = builder.builder->CreateAlloca(this->m_ty->codegen(builder, scope.structs)); if (this->m_ty->m_kind == types::TypeKind::Array) { auto array_ty = dynamic_cast(this->m_ty.get()); @@ -339,7 +339,7 @@ namespace AST { std::vector indices{}; indices.push_back(llvm::ConstantInt::get(builder.builder->getInt32Ty(), counter++)); auto gep = builder.builder->CreateGEP( - array_ty->m_inner->codegen(builder, scope.structs), array_ptr, indices, "GEP"); + array_ty->m_inner->codegen(builder, scope.structs), value_ptr, indices, "GEP"); builder.builder->CreateStore(expr->codegen(builder, scope).value, gep); } @@ -348,13 +348,38 @@ namespace AST { }; if (scope.is_lvalue) { - return codegen::StackValue{ array_ptr, ptr_ty }; + return codegen::StackValue{ value_ptr, ptr_ty }; } else { - auto loaded = ptr_ty->load(builder, array_ptr, scope.structs); + auto loaded = ptr_ty->load(builder, value_ptr, scope.structs); return codegen::StackValue{ loaded.first, loaded.second }; } } + else if (this->m_ty->m_kind == types::TypeKind::Struct) { + auto struct_ty = dynamic_cast(this->m_ty.get()); + + for (int i = 0; i < static_cast(this->m_expressions.size()); i++) { + std::vector indices{}; + auto gep = builder.builder->CreateStructGEP( + struct_ty->codegen(builder, scope.structs), value_ptr, i, "struct_gep" + ); + builder.builder->CreateStore( + this->m_expressions[i]->codegen(builder, scope).value, gep); + } + + auto ptr_ty = std::shared_ptr{ + new types::PointerType{this->m_ty} + }; + + if (scope.is_lvalue) { + return codegen::StackValue{ value_ptr, ptr_ty }; + } + else { + auto loaded = ptr_ty->load(builder, value_ptr, scope.structs); + return codegen::StackValue{ loaded.first, loaded.second }; + } + + } else { throw CompileError("Tried to list-initialize a non-array!", this->m_meta); }