Allow loading stack values

This commit is contained in:
Sofia 2026-04-09 16:02:34 +03:00
parent 1070aa6ed0
commit 89db646873
6 changed files with 34 additions and 3 deletions

View File

@ -27,6 +27,10 @@ namespace AST {
return out.str(); return out.str();
} }
std::string ValueReferenceExpression::formatted() {
return this->m_name;
}
std::string Function::formatted() { std::string Function::formatted() {
std::stringstream out{ "" }; std::stringstream out{ "" };
out << this->m_name; out << this->m_name;

View File

@ -41,6 +41,16 @@ namespace AST {
virtual llvm::Value* codegen(codegen::Builder& builder, codegen::Scope& scope) override; virtual llvm::Value* codegen(codegen::Builder& builder, codegen::Scope& scope) override;
}; };
class ValueReferenceExpression : public Expression {
private:
std::string m_name;
public:
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;
};
class ReturnStatement : public Statement { class ReturnStatement : public Statement {
private: private:

View File

@ -12,6 +12,16 @@ namespace AST {
return llvm::ConstantInt::get(ty, this->m_value); return llvm::ConstantInt::get(ty, this->m_value);
} }
llvm::Value* ValueReferenceExpression::codegen(codegen::Builder& builder, codegen::Scope& scope) {
auto value = scope.values.find(this->m_name);
if (value != scope.values.end()) {
return builder.builder->CreateLoad(value->second.ty, value->second.value);
}
else {
throw new std::runtime_error("Value " + this->m_name + " not found");
}
}
void ReturnStatement::codegen(codegen::Builder& builder, codegen::Scope& scope) { void ReturnStatement::codegen(codegen::Builder& builder, codegen::Scope& scope) {
if (!builder.block) if (!builder.block)
return; return;
@ -35,6 +45,7 @@ namespace AST {
builder.builder->CreateStore(value, ptr, false); builder.builder->CreateStore(value, ptr, false);
} }
scope.values[this->m_name] = codegen::StackValue{ ptr, ty };
} }
void Function::codegen(codegen::Builder& builder, codegen::Scope& scope) { void Function::codegen(codegen::Builder& builder, codegen::Scope& scope) {

View File

@ -14,13 +14,13 @@ namespace codegen {
std::unique_ptr<llvm::BasicBlock> block; std::unique_ptr<llvm::BasicBlock> block;
}; };
struct ScopeValue { struct StackValue {
llvm::Value* value; llvm::Value* value;
llvm::Type* ty; llvm::Type* ty;
}; };
struct Scope { struct Scope {
std::map<std::string, ScopeValue> values; std::map<std::string, StackValue> values;
}; };
} }

View File

@ -28,6 +28,12 @@ namespace parsing {
auto expr = new AST::IntLiteralExpression{ std::stoi(token.content) }; auto expr = new AST::IntLiteralExpression{ std::stoi(token.content) };
return new std::unique_ptr<AST::Expression>{ expr }; return new std::unique_ptr<AST::Expression>{ expr };
} }
else if (token.type == token::Type::Ident) {
stream.m_position = inner.m_position;
auto expr = new AST::ValueReferenceExpression{ token.content };
return new std::unique_ptr<AST::Expression>{ expr };
}
else { else {
throw std::runtime_error("Expected expression"); throw std::runtime_error("Expected expression");
} }

2
test.c
View File

@ -1,4 +1,4 @@
int main() { int main() {
int a = 5; int a = 5;
return 15; return a;
} }