Implement struct initialization
This commit is contained in:
parent
4b4d3ce14b
commit
9ed753a238
@ -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<types::ArrayType*>(this->m_ty.get());
|
||||
@ -339,7 +339,7 @@ namespace AST {
|
||||
std::vector<llvm::Value*> 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<types::StructType*>(this->m_ty.get());
|
||||
|
||||
for (int i = 0; i < static_cast<int>(this->m_expressions.size()); i++) {
|
||||
std::vector<llvm::Value*> 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<types::Type>{
|
||||
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);
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user