Make expressions return StackValue

This commit is contained in:
Sofia 2026-04-09 17:44:22 +03:00
parent 16833ad1a0
commit 43abaa4a46
2 changed files with 16 additions and 13 deletions

View File

@ -23,7 +23,7 @@ namespace AST {
class Expression : public Node {
public:
virtual llvm::Value* codegen(codegen::Builder& builder, codegen::Scope& scope) = 0;
virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope) = 0;
};
class Type {
@ -45,7 +45,7 @@ namespace AST {
IntLiteralExpression(int value) : m_value{ value } {}
virtual ~IntLiteralExpression() override = default;
virtual std::string formatted() override;
virtual llvm::Value* codegen(codegen::Builder& builder, codegen::Scope& scope) override;
virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope) override;
};
class ValueReferenceExpression : public Expression {
@ -55,7 +55,7 @@ namespace AST {
ValueReferenceExpression(std::string name) : m_name{ name } {}
virtual ~ValueReferenceExpression() override = default;
virtual std::string formatted() override;
virtual llvm::Value* codegen(codegen::Builder& builder, codegen::Scope& scope) override;
virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope) override;
};
class BinaryOperationExpression : public Expression {
@ -69,7 +69,7 @@ namespace AST {
}
virtual ~BinaryOperationExpression() override = default;
virtual std::string formatted() override;
virtual llvm::Value* codegen(codegen::Builder& builder, codegen::Scope& scope) override;
virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope) override;
};

View File

@ -13,19 +13,22 @@ namespace codegen {
}
namespace AST {
llvm::Value* IntLiteralExpression::codegen(codegen::Builder& builder, codegen::Scope& scope) {
codegen::StackValue IntLiteralExpression::codegen(codegen::Builder& builder, codegen::Scope& scope) {
auto ty = builder.builder->getInt32Ty();
return llvm::ConstantInt::get(ty, this->m_value);
return codegen::StackValue{ llvm::ConstantInt::get(ty, this->m_value), ty };
}
llvm::Value* ValueReferenceExpression::codegen(codegen::Builder& builder, codegen::Scope& scope) {
codegen::StackValue ValueReferenceExpression::codegen(codegen::Builder& builder, codegen::Scope& scope) {
auto value = scope.values.find(this->m_name);
if (value != scope.values.end()) {
if (scope.is_lvalue) {
return value->second.value;
return value->second;
}
else {
return builder.builder->CreateLoad(value->second.ty, value->second.value);
return codegen::StackValue{
builder.builder->CreateLoad(value->second.ty, value->second.value),
value->second.ty
};
}
}
else {
@ -33,13 +36,13 @@ namespace AST {
}
}
llvm::Value* BinaryOperationExpression::codegen(codegen::Builder& builder, codegen::Scope& scope) {
codegen::StackValue BinaryOperationExpression::codegen(codegen::Builder& builder, codegen::Scope& scope) {
auto lvalued = scope.with_lvalue();
auto lhs = this->m_lhs->codegen(builder, lvalued);
auto rhs = this->m_rhs->codegen(builder, scope);
switch (this->m_binop) {
case BinOp::Assignment:
builder.builder->CreateStore(rhs, lhs, false);
builder.builder->CreateStore(rhs.value, lhs.value, false);
if (scope.is_lvalue) {
return lhs;
}
@ -58,7 +61,7 @@ namespace AST {
builder.builder->SetInsertPoint(builder.block);
auto value = this->m_expr->codegen(builder, scope);
builder.builder->CreateRet(value);
builder.builder->CreateRet(value.value);
}
void ExpressionStatement::codegen(codegen::Builder& builder, codegen::Scope& scope) {
@ -79,7 +82,7 @@ namespace AST {
auto ptr = builder.builder->CreateAlloca(ty);
if (this->m_expr.has_value()) {
auto value = this->m_expr->get()->codegen(builder, scope);
builder.builder->CreateStore(value, ptr, false);
builder.builder->CreateStore(value.value, ptr, false);
}
scope.values[this->m_name] = codegen::StackValue{ ptr, ty };