Allow loading stack values
This commit is contained in:
parent
1070aa6ed0
commit
89db646873
@ -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;
|
||||||
|
|||||||
10
src/ast.h
10
src/ast.h
@ -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:
|
||||||
|
|||||||
@ -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) {
|
||||||
|
|||||||
@ -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;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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");
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user