Pass allocator in codegen
This commit is contained in:
parent
bf87aa8c08
commit
8530e1162d
34
src/ast.h
34
src/ast.h
@ -25,7 +25,7 @@ namespace AST {
|
|||||||
class Expression : public Node {
|
class Expression : public Node {
|
||||||
public:
|
public:
|
||||||
Expression(token::Metadata meta) : Node{ meta } {}
|
Expression(token::Metadata meta) : Node{ meta } {}
|
||||||
virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope) = 0;
|
virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) = 0;
|
||||||
virtual void codegen_alloca(codegen::StackAllocator& allocator) = 0;
|
virtual void codegen_alloca(codegen::StackAllocator& allocator) = 0;
|
||||||
virtual std::shared_ptr<types::Type> get_codegen_type(codegen::Scope& scope) = 0;
|
virtual std::shared_ptr<types::Type> get_codegen_type(codegen::Scope& scope) = 0;
|
||||||
virtual void typecheck_preprocess(typecheck::Scope& scope) = 0;
|
virtual void typecheck_preprocess(typecheck::Scope& scope) = 0;
|
||||||
@ -39,7 +39,7 @@ namespace AST {
|
|||||||
class Statement : public Node {
|
class Statement : public Node {
|
||||||
public:
|
public:
|
||||||
Statement(token::Metadata meta) : Node{ meta } {}
|
Statement(token::Metadata meta) : Node{ meta } {}
|
||||||
virtual void codegen(codegen::Builder& builder, codegen::Scope& scope) = 0;
|
virtual void codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) = 0;
|
||||||
virtual void codegen_alloca(codegen::StackAllocator& allocator) = 0;
|
virtual void codegen_alloca(codegen::StackAllocator& allocator) = 0;
|
||||||
virtual void typecheck_preprocess(typecheck::Scope& scope) = 0;
|
virtual void typecheck_preprocess(typecheck::Scope& scope) = 0;
|
||||||
virtual void typecheck(typecheck::State& state, typecheck::Scope& scope) = 0;
|
virtual void typecheck(typecheck::State& state, typecheck::Scope& scope) = 0;
|
||||||
@ -60,7 +60,7 @@ namespace AST {
|
|||||||
}
|
}
|
||||||
virtual ~IntLiteralExpression() override = default;
|
virtual ~IntLiteralExpression() override = default;
|
||||||
virtual std::string formatted() override;
|
virtual std::string formatted() override;
|
||||||
virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope) override;
|
virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) override;
|
||||||
virtual void codegen_alloca(codegen::StackAllocator& allocator) override;
|
virtual void codegen_alloca(codegen::StackAllocator& allocator) override;
|
||||||
virtual std::shared_ptr<types::Type> get_codegen_type(codegen::Scope& scope) override;
|
virtual std::shared_ptr<types::Type> get_codegen_type(codegen::Scope& scope) override;
|
||||||
virtual void typecheck_preprocess(typecheck::Scope& scope) override;
|
virtual void typecheck_preprocess(typecheck::Scope& scope) override;
|
||||||
@ -79,7 +79,7 @@ namespace AST {
|
|||||||
StringLiteralExpression(token::Metadata meta, std::string value) : Expression{ meta }, m_value{ value } {}
|
StringLiteralExpression(token::Metadata meta, std::string value) : Expression{ meta }, m_value{ value } {}
|
||||||
virtual ~StringLiteralExpression() override = default;
|
virtual ~StringLiteralExpression() override = default;
|
||||||
virtual std::string formatted() override;
|
virtual std::string formatted() override;
|
||||||
virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope) override;
|
virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) override;
|
||||||
virtual void codegen_alloca(codegen::StackAllocator& allocator) override;
|
virtual void codegen_alloca(codegen::StackAllocator& allocator) override;
|
||||||
virtual std::shared_ptr<types::Type> get_codegen_type(codegen::Scope& scope) override;
|
virtual std::shared_ptr<types::Type> get_codegen_type(codegen::Scope& scope) override;
|
||||||
virtual void typecheck_preprocess(typecheck::Scope& scope) override;
|
virtual void typecheck_preprocess(typecheck::Scope& scope) override;
|
||||||
@ -98,7 +98,7 @@ namespace AST {
|
|||||||
ValueReferenceExpression(token::Metadata meta, std::string name) : Expression{ meta }, m_name{ name } {}
|
ValueReferenceExpression(token::Metadata meta, std::string name) : Expression{ meta }, m_name{ name } {}
|
||||||
virtual ~ValueReferenceExpression() override = default;
|
virtual ~ValueReferenceExpression() override = default;
|
||||||
virtual std::string formatted() override;
|
virtual std::string formatted() override;
|
||||||
virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope) override;
|
virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) override;
|
||||||
virtual void codegen_alloca(codegen::StackAllocator& allocator) override;
|
virtual void codegen_alloca(codegen::StackAllocator& allocator) override;
|
||||||
virtual std::shared_ptr<types::Type> get_codegen_type(codegen::Scope& scope) override;
|
virtual std::shared_ptr<types::Type> get_codegen_type(codegen::Scope& scope) override;
|
||||||
virtual void typecheck_preprocess(typecheck::Scope& scope) override;
|
virtual void typecheck_preprocess(typecheck::Scope& scope) override;
|
||||||
@ -128,7 +128,7 @@ namespace AST {
|
|||||||
}
|
}
|
||||||
virtual ~BinaryOperationExpression() override = default;
|
virtual ~BinaryOperationExpression() override = default;
|
||||||
virtual std::string formatted() override;
|
virtual std::string formatted() override;
|
||||||
virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope) override;
|
virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) override;
|
||||||
virtual void codegen_alloca(codegen::StackAllocator& allocator) override;
|
virtual void codegen_alloca(codegen::StackAllocator& allocator) override;
|
||||||
virtual std::shared_ptr<types::Type> get_codegen_type(codegen::Scope& scope) override;
|
virtual std::shared_ptr<types::Type> get_codegen_type(codegen::Scope& scope) override;
|
||||||
virtual void typecheck_preprocess(typecheck::Scope& scope) override;
|
virtual void typecheck_preprocess(typecheck::Scope& scope) override;
|
||||||
@ -155,7 +155,7 @@ namespace AST {
|
|||||||
}
|
}
|
||||||
virtual ~FunctionCallExpression() override = default;
|
virtual ~FunctionCallExpression() override = default;
|
||||||
virtual std::string formatted() override;
|
virtual std::string formatted() override;
|
||||||
virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope) override;
|
virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) override;
|
||||||
virtual void codegen_alloca(codegen::StackAllocator& allocator) override;
|
virtual void codegen_alloca(codegen::StackAllocator& allocator) override;
|
||||||
virtual std::shared_ptr<types::Type> get_codegen_type(codegen::Scope& scope) override;
|
virtual std::shared_ptr<types::Type> get_codegen_type(codegen::Scope& scope) override;
|
||||||
virtual void typecheck_preprocess(typecheck::Scope& scope) override;
|
virtual void typecheck_preprocess(typecheck::Scope& scope) override;
|
||||||
@ -182,7 +182,7 @@ namespace AST {
|
|||||||
}
|
}
|
||||||
virtual ~CastExpression() override = default;
|
virtual ~CastExpression() override = default;
|
||||||
virtual std::string formatted() override;
|
virtual std::string formatted() override;
|
||||||
virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope) override;
|
virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) override;
|
||||||
virtual void codegen_alloca(codegen::StackAllocator& allocator) override;
|
virtual void codegen_alloca(codegen::StackAllocator& allocator) override;
|
||||||
virtual std::shared_ptr<types::Type> get_codegen_type(codegen::Scope& scope) override;
|
virtual std::shared_ptr<types::Type> get_codegen_type(codegen::Scope& scope) override;
|
||||||
virtual void typecheck_preprocess(typecheck::Scope& scope) override;
|
virtual void typecheck_preprocess(typecheck::Scope& scope) override;
|
||||||
@ -206,7 +206,7 @@ namespace AST {
|
|||||||
}
|
}
|
||||||
virtual ~RefExpression() override = default;
|
virtual ~RefExpression() override = default;
|
||||||
virtual std::string formatted() override;
|
virtual std::string formatted() override;
|
||||||
virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope) override;
|
virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) override;
|
||||||
virtual void codegen_alloca(codegen::StackAllocator& allocator) override;
|
virtual void codegen_alloca(codegen::StackAllocator& allocator) override;
|
||||||
virtual std::shared_ptr<types::Type> get_codegen_type(codegen::Scope& scope) override;
|
virtual std::shared_ptr<types::Type> get_codegen_type(codegen::Scope& scope) override;
|
||||||
virtual void typecheck_preprocess(typecheck::Scope& scope) override;
|
virtual void typecheck_preprocess(typecheck::Scope& scope) override;
|
||||||
@ -230,7 +230,7 @@ namespace AST {
|
|||||||
}
|
}
|
||||||
virtual ~DerefExpression() override = default;
|
virtual ~DerefExpression() override = default;
|
||||||
virtual std::string formatted() override;
|
virtual std::string formatted() override;
|
||||||
virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope) override;
|
virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) override;
|
||||||
virtual void codegen_alloca(codegen::StackAllocator& allocator) override;
|
virtual void codegen_alloca(codegen::StackAllocator& allocator) override;
|
||||||
virtual std::shared_ptr<types::Type> get_codegen_type(codegen::Scope& scope) override;
|
virtual std::shared_ptr<types::Type> get_codegen_type(codegen::Scope& scope) override;
|
||||||
virtual void typecheck_preprocess(typecheck::Scope& scope) override;
|
virtual void typecheck_preprocess(typecheck::Scope& scope) override;
|
||||||
@ -257,7 +257,7 @@ namespace AST {
|
|||||||
}
|
}
|
||||||
virtual ~IndexAccessExpression() override = default;
|
virtual ~IndexAccessExpression() override = default;
|
||||||
virtual std::string formatted() override;
|
virtual std::string formatted() override;
|
||||||
virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope) override;
|
virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) override;
|
||||||
virtual void codegen_alloca(codegen::StackAllocator& allocator) override;
|
virtual void codegen_alloca(codegen::StackAllocator& allocator) override;
|
||||||
virtual std::shared_ptr<types::Type> get_codegen_type(codegen::Scope& scope) override;
|
virtual std::shared_ptr<types::Type> get_codegen_type(codegen::Scope& scope) override;
|
||||||
virtual void typecheck_preprocess(typecheck::Scope& scope) override;
|
virtual void typecheck_preprocess(typecheck::Scope& scope) override;
|
||||||
@ -284,7 +284,7 @@ namespace AST {
|
|||||||
}
|
}
|
||||||
virtual ~FieldAccessExpression() override = default;
|
virtual ~FieldAccessExpression() override = default;
|
||||||
virtual std::string formatted() override;
|
virtual std::string formatted() override;
|
||||||
virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope) override;
|
virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) override;
|
||||||
virtual void codegen_alloca(codegen::StackAllocator& allocator) override;
|
virtual void codegen_alloca(codegen::StackAllocator& allocator) override;
|
||||||
virtual std::shared_ptr<types::Type> get_codegen_type(codegen::Scope& scope) override;
|
virtual std::shared_ptr<types::Type> get_codegen_type(codegen::Scope& scope) override;
|
||||||
virtual void typecheck_preprocess(typecheck::Scope& scope) override;
|
virtual void typecheck_preprocess(typecheck::Scope& scope) override;
|
||||||
@ -311,7 +311,7 @@ namespace AST {
|
|||||||
}
|
}
|
||||||
virtual ~ListInitializerExpression() override = default;
|
virtual ~ListInitializerExpression() override = default;
|
||||||
virtual std::string formatted() override;
|
virtual std::string formatted() override;
|
||||||
virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope) override;
|
virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) override;
|
||||||
virtual void codegen_alloca(codegen::StackAllocator& allocator) override;
|
virtual void codegen_alloca(codegen::StackAllocator& allocator) override;
|
||||||
virtual std::shared_ptr<types::Type> get_codegen_type(codegen::Scope& scope) override;
|
virtual std::shared_ptr<types::Type> get_codegen_type(codegen::Scope& scope) override;
|
||||||
virtual void typecheck_preprocess(typecheck::Scope& scope) override;
|
virtual void typecheck_preprocess(typecheck::Scope& scope) override;
|
||||||
@ -332,7 +332,7 @@ namespace AST {
|
|||||||
}
|
}
|
||||||
virtual ~ReturnStatement() override = default;
|
virtual ~ReturnStatement() override = default;
|
||||||
virtual std::string formatted() override;
|
virtual std::string formatted() override;
|
||||||
virtual void codegen(codegen::Builder& builder, codegen::Scope& scope) override;
|
virtual void codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) override;
|
||||||
virtual void codegen_alloca(codegen::StackAllocator& allocator) override;
|
virtual void codegen_alloca(codegen::StackAllocator& allocator) override;
|
||||||
virtual void typecheck_preprocess(typecheck::Scope& scope) override;
|
virtual void typecheck_preprocess(typecheck::Scope& scope) override;
|
||||||
virtual void typecheck(typecheck::State& state, typecheck::Scope& scope) override;
|
virtual void typecheck(typecheck::State& state, typecheck::Scope& scope) override;
|
||||||
@ -356,7 +356,7 @@ namespace AST {
|
|||||||
}
|
}
|
||||||
virtual ~InitializationStatement() override = default;
|
virtual ~InitializationStatement() override = default;
|
||||||
virtual std::string formatted() override;
|
virtual std::string formatted() override;
|
||||||
virtual void codegen(codegen::Builder& builder, codegen::Scope& scope) override;
|
virtual void codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) override;
|
||||||
virtual void codegen_alloca(codegen::StackAllocator& allocator) override;
|
virtual void codegen_alloca(codegen::StackAllocator& allocator) override;
|
||||||
virtual void typecheck_preprocess(typecheck::Scope& scope) override;
|
virtual void typecheck_preprocess(typecheck::Scope& scope) override;
|
||||||
virtual void typecheck(typecheck::State& state, typecheck::Scope& scope) override;
|
virtual void typecheck(typecheck::State& state, typecheck::Scope& scope) override;
|
||||||
@ -371,7 +371,7 @@ namespace AST {
|
|||||||
}
|
}
|
||||||
virtual ~ExpressionStatement() override = default;
|
virtual ~ExpressionStatement() override = default;
|
||||||
virtual std::string formatted() override;
|
virtual std::string formatted() override;
|
||||||
virtual void codegen(codegen::Builder& builder, codegen::Scope& scope) override;
|
virtual void codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) override;
|
||||||
virtual void codegen_alloca(codegen::StackAllocator& allocator) override;
|
virtual void codegen_alloca(codegen::StackAllocator& allocator) override;
|
||||||
virtual void typecheck_preprocess(typecheck::Scope& scope) override;
|
virtual void typecheck_preprocess(typecheck::Scope& scope) override;
|
||||||
virtual void typecheck(typecheck::State& state, typecheck::Scope& scope) override;
|
virtual void typecheck(typecheck::State& state, typecheck::Scope& scope) override;
|
||||||
@ -394,7 +394,7 @@ namespace AST {
|
|||||||
}
|
}
|
||||||
virtual ~IfStatement() override = default;
|
virtual ~IfStatement() override = default;
|
||||||
virtual std::string formatted() override;
|
virtual std::string formatted() override;
|
||||||
virtual void codegen(codegen::Builder& builder, codegen::Scope& scope) override;
|
virtual void codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) override;
|
||||||
virtual void codegen_alloca(codegen::StackAllocator& allocator) override;
|
virtual void codegen_alloca(codegen::StackAllocator& allocator) override;
|
||||||
virtual void typecheck_preprocess(typecheck::Scope& scope) override;
|
virtual void typecheck_preprocess(typecheck::Scope& scope) override;
|
||||||
virtual void typecheck(typecheck::State& state, typecheck::Scope& scope) override;
|
virtual void typecheck(typecheck::State& state, typecheck::Scope& scope) override;
|
||||||
|
|||||||
@ -20,7 +20,7 @@ namespace AST {
|
|||||||
return this->m_ty;
|
return this->m_ty;
|
||||||
}
|
}
|
||||||
|
|
||||||
codegen::StackValue IntLiteralExpression::codegen(codegen::Builder& builder, codegen::Scope& scope) {
|
codegen::StackValue IntLiteralExpression::codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) {
|
||||||
auto ty = this->m_ty->codegen(builder, scope.structs);
|
auto ty = this->m_ty->codegen(builder, scope.structs);
|
||||||
|
|
||||||
return codegen::StackValue{
|
return codegen::StackValue{
|
||||||
@ -38,7 +38,7 @@ namespace AST {
|
|||||||
return std::shared_ptr<types::Type> {stack_type};
|
return std::shared_ptr<types::Type> {stack_type};
|
||||||
}
|
}
|
||||||
|
|
||||||
codegen::StackValue StringLiteralExpression::codegen(codegen::Builder& builder, codegen::Scope& scope) {
|
codegen::StackValue StringLiteralExpression::codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) {
|
||||||
auto stack_type = new types::ArrayType{
|
auto stack_type = new types::ArrayType{
|
||||||
std::make_shared<types::FundamentalType>(true, types::FundamentalTypeKind::Char),
|
std::make_shared<types::FundamentalType>(true, types::FundamentalTypeKind::Char),
|
||||||
static_cast<uint32_t>(this->m_value.size()) + 1,
|
static_cast<uint32_t>(this->m_value.size()) + 1,
|
||||||
@ -78,7 +78,7 @@ namespace AST {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
codegen::StackValue ValueReferenceExpression::codegen(codegen::Builder& builder, codegen::Scope& scope) {
|
codegen::StackValue ValueReferenceExpression::codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) {
|
||||||
auto value = scope.values.find(this->m_name);
|
auto value = scope.values.find(this->m_name);
|
||||||
if (value != scope.values.end()) {
|
if (value != scope.values.end()) {
|
||||||
if (scope.is_lvalue) {
|
if (scope.is_lvalue) {
|
||||||
@ -121,10 +121,10 @@ namespace AST {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
codegen::StackValue BinaryOperationExpression::codegen(codegen::Builder& builder, codegen::Scope& scope) {
|
codegen::StackValue BinaryOperationExpression::codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) {
|
||||||
auto lvalued = scope.with_lvalue();
|
auto lvalued = scope.with_lvalue();
|
||||||
auto lhs = this->m_lhs->codegen(builder, this->m_binop == types::BinOp::Assignment ? lvalued : scope);
|
auto lhs = this->m_lhs->codegen(builder, this->m_binop == types::BinOp::Assignment ? lvalued : scope, allocator);
|
||||||
auto rhs = this->m_rhs->codegen(builder, scope);
|
auto rhs = this->m_rhs->codegen(builder, scope, allocator);
|
||||||
try {
|
try {
|
||||||
switch (this->m_binop) {
|
switch (this->m_binop) {
|
||||||
case types::BinOp::Assignment:
|
case types::BinOp::Assignment:
|
||||||
@ -155,12 +155,12 @@ namespace AST {
|
|||||||
return *fn_ty->return_type();
|
return *fn_ty->return_type();
|
||||||
}
|
}
|
||||||
|
|
||||||
codegen::StackValue FunctionCallExpression::codegen(codegen::Builder& builder, codegen::Scope& scope) {
|
codegen::StackValue FunctionCallExpression::codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) {
|
||||||
std::vector<llvm::Value*> args{};
|
std::vector<llvm::Value*> args{};
|
||||||
for (auto& arg : this->m_args) {
|
for (auto& arg : this->m_args) {
|
||||||
args.push_back(arg->codegen(builder, scope).value);
|
args.push_back(arg->codegen(builder, scope, allocator).value);
|
||||||
}
|
}
|
||||||
auto function = this->m_fn_expr->codegen(builder, scope);
|
auto function = this->m_fn_expr->codegen(builder, scope, allocator);
|
||||||
|
|
||||||
auto value = builder.builder->CreateCall(llvm::dyn_cast<llvm::FunctionType>(function.ty->codegen(builder, scope.structs)), function.value, args, "call");
|
auto value = builder.builder->CreateCall(llvm::dyn_cast<llvm::FunctionType>(function.ty->codegen(builder, scope.structs)), function.value, args, "call");
|
||||||
return codegen::StackValue{
|
return codegen::StackValue{
|
||||||
@ -173,12 +173,12 @@ namespace AST {
|
|||||||
return this->m_ty;
|
return this->m_ty;
|
||||||
}
|
}
|
||||||
|
|
||||||
codegen::StackValue CastExpression::codegen(codegen::Builder& builder, codegen::Scope& scope) {
|
codegen::StackValue CastExpression::codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) {
|
||||||
auto expr_ty = this->m_expr->get_codegen_type(scope);
|
auto expr_ty = this->m_expr->get_codegen_type(scope);
|
||||||
if (expr_ty->m_kind == types::TypeKind::Array
|
if (expr_ty->m_kind == types::TypeKind::Array
|
||||||
&& this->m_ty->m_kind == types::TypeKind::Pointer) {
|
&& this->m_ty->m_kind == types::TypeKind::Pointer) {
|
||||||
auto lvalued = scope.with_lvalue();
|
auto lvalued = scope.with_lvalue();
|
||||||
auto expr = this->m_expr->codegen(builder, lvalued);
|
auto expr = this->m_expr->codegen(builder, lvalued, allocator);
|
||||||
auto cast = types::find_cast(scope.casts, expr.ty, this->m_ty);
|
auto cast = types::find_cast(scope.casts, expr.ty, this->m_ty);
|
||||||
if (cast) {
|
if (cast) {
|
||||||
return codegen::StackValue{
|
return codegen::StackValue{
|
||||||
@ -191,7 +191,7 @@ namespace AST {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
auto expr = this->m_expr->codegen(builder, scope);
|
auto expr = this->m_expr->codegen(builder, scope, allocator);
|
||||||
auto cast = types::find_cast(scope.casts, expr.ty, this->m_ty);
|
auto cast = types::find_cast(scope.casts, expr.ty, this->m_ty);
|
||||||
if (cast) {
|
if (cast) {
|
||||||
return codegen::StackValue{
|
return codegen::StackValue{
|
||||||
@ -209,9 +209,9 @@ namespace AST {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
codegen::StackValue RefExpression::codegen(codegen::Builder& builder, codegen::Scope& scope) {
|
codegen::StackValue RefExpression::codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) {
|
||||||
auto with_lvalue = scope.with_lvalue();
|
auto with_lvalue = scope.with_lvalue();
|
||||||
return this->m_expr->codegen(builder, with_lvalue);
|
return this->m_expr->codegen(builder, with_lvalue, allocator);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<types::Type> DerefExpression::get_codegen_type(codegen::Scope& scope) {
|
std::shared_ptr<types::Type> DerefExpression::get_codegen_type(codegen::Scope& scope) {
|
||||||
@ -225,8 +225,8 @@ namespace AST {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
codegen::StackValue DerefExpression::codegen(codegen::Builder& builder, codegen::Scope& scope) {
|
codegen::StackValue DerefExpression::codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) {
|
||||||
auto value = this->m_expr->codegen(builder, scope);
|
auto value = this->m_expr->codegen(builder, scope, allocator);
|
||||||
if (value.ty->m_kind == types::TypeKind::Pointer) {
|
if (value.ty->m_kind == types::TypeKind::Pointer) {
|
||||||
auto loaded = value.ty->load(builder, value.value, scope.structs);
|
auto loaded = value.ty->load(builder, value.value, scope.structs);
|
||||||
return codegen::StackValue{
|
return codegen::StackValue{
|
||||||
@ -255,16 +255,16 @@ namespace AST {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
codegen::StackValue IndexAccessExpression::codegen(codegen::Builder& builder, codegen::Scope& scope) {
|
codegen::StackValue IndexAccessExpression::codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) {
|
||||||
auto intended_ty = this->m_expr->get_codegen_type(scope);
|
auto intended_ty = this->m_expr->get_codegen_type(scope);
|
||||||
|
|
||||||
codegen::StackValue value;
|
codegen::StackValue value;
|
||||||
if (intended_ty->m_kind != types::TypeKind::Pointer) {
|
if (intended_ty->m_kind != types::TypeKind::Pointer) {
|
||||||
auto lvalued = scope.with_lvalue();
|
auto lvalued = scope.with_lvalue();
|
||||||
value = this->m_expr->codegen(builder, lvalued);
|
value = this->m_expr->codegen(builder, lvalued, allocator);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
value = this->m_expr->codegen(builder, scope);
|
value = this->m_expr->codegen(builder, scope, allocator);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::cout << intended_ty->formatted() << std::endl;
|
std::cout << intended_ty->formatted() << std::endl;
|
||||||
@ -339,9 +339,9 @@ namespace AST {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
codegen::StackValue FieldAccessExpression::codegen(codegen::Builder& builder, codegen::Scope& scope) {
|
codegen::StackValue FieldAccessExpression::codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) {
|
||||||
auto lvalued = scope.with_lvalue();
|
auto lvalued = scope.with_lvalue();
|
||||||
auto struct_ptr = this->m_expr->codegen(builder, lvalued);
|
auto struct_ptr = this->m_expr->codegen(builder, lvalued, allocator);
|
||||||
if (struct_ptr.ty->m_kind == types::TypeKind::Pointer) {
|
if (struct_ptr.ty->m_kind == types::TypeKind::Pointer) {
|
||||||
auto ptr_ty = dynamic_cast<types::PointerType*>(struct_ptr.ty.get());
|
auto ptr_ty = dynamic_cast<types::PointerType*>(struct_ptr.ty.get());
|
||||||
if (ptr_ty->m_inner->m_kind == types::TypeKind::Struct) {
|
if (ptr_ty->m_inner->m_kind == types::TypeKind::Struct) {
|
||||||
@ -392,7 +392,7 @@ namespace AST {
|
|||||||
return this->m_ty;
|
return this->m_ty;
|
||||||
}
|
}
|
||||||
|
|
||||||
codegen::StackValue ListInitializerExpression::codegen(codegen::Builder& builder, codegen::Scope& scope) {
|
codegen::StackValue ListInitializerExpression::codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) {
|
||||||
auto value_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) {
|
if (this->m_ty->m_kind == types::TypeKind::Array) {
|
||||||
@ -404,7 +404,7 @@ namespace AST {
|
|||||||
indices.push_back(llvm::ConstantInt::get(builder.builder->getInt32Ty(), counter++));
|
indices.push_back(llvm::ConstantInt::get(builder.builder->getInt32Ty(), counter++));
|
||||||
auto gep = builder.builder->CreateGEP(
|
auto gep = builder.builder->CreateGEP(
|
||||||
array_ty->m_inner->codegen(builder, scope.structs), value_ptr, indices, "GEP");
|
array_ty->m_inner->codegen(builder, scope.structs), value_ptr, indices, "GEP");
|
||||||
builder.builder->CreateStore(expr->codegen(builder, scope).value, gep);
|
builder.builder->CreateStore(expr->codegen(builder, scope, allocator).value, gep);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto ptr_ty = std::shared_ptr<types::Type>{
|
auto ptr_ty = std::shared_ptr<types::Type>{
|
||||||
@ -428,7 +428,7 @@ namespace AST {
|
|||||||
struct_ty->codegen(builder, scope.structs), value_ptr, i, "struct_gep"
|
struct_ty->codegen(builder, scope.structs), value_ptr, i, "struct_gep"
|
||||||
);
|
);
|
||||||
builder.builder->CreateStore(
|
builder.builder->CreateStore(
|
||||||
this->m_expressions[i]->codegen(builder, scope).value, gep);
|
this->m_expressions[i]->codegen(builder, scope, allocator).value, gep);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto ptr_ty = std::shared_ptr<types::Type>{
|
auto ptr_ty = std::shared_ptr<types::Type>{
|
||||||
@ -450,25 +450,25 @@ namespace AST {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ReturnStatement::codegen(codegen::Builder& builder, codegen::Scope& scope) {
|
void ReturnStatement::codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) {
|
||||||
if (!builder.block)
|
if (!builder.block)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
builder.builder->SetInsertPoint(builder.block);
|
builder.builder->SetInsertPoint(builder.block);
|
||||||
|
|
||||||
auto value = this->m_expr->codegen(builder, scope);
|
auto value = this->m_expr->codegen(builder, scope, allocator);
|
||||||
builder.builder->CreateRet(value.value);
|
builder.builder->CreateRet(value.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ExpressionStatement::codegen(codegen::Builder& builder, codegen::Scope& scope) {
|
void ExpressionStatement::codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) {
|
||||||
if (!builder.block)
|
if (!builder.block)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
builder.builder->SetInsertPoint(builder.block);
|
builder.builder->SetInsertPoint(builder.block);
|
||||||
this->m_expr->codegen(builder, scope);
|
this->m_expr->codegen(builder, scope, allocator);
|
||||||
}
|
}
|
||||||
|
|
||||||
void InitializationStatement::codegen(codegen::Builder& builder, codegen::Scope& scope) {
|
void InitializationStatement::codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) {
|
||||||
if (!builder.block)
|
if (!builder.block)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -478,7 +478,7 @@ namespace AST {
|
|||||||
auto raw_llvm_ty = this->m_type->codegen(builder, scope.structs);
|
auto raw_llvm_ty = this->m_type->codegen(builder, scope.structs);
|
||||||
auto ptr = builder.builder->CreateAlloca(raw_llvm_ty);
|
auto ptr = builder.builder->CreateAlloca(raw_llvm_ty);
|
||||||
if (this->m_expr.has_value()) {
|
if (this->m_expr.has_value()) {
|
||||||
auto value = this->m_expr->get()->codegen(builder, scope);
|
auto value = this->m_expr->get()->codegen(builder, scope, allocator);
|
||||||
builder.builder->CreateStore(value.value, ptr, false);
|
builder.builder->CreateStore(value.value, ptr, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -489,7 +489,7 @@ namespace AST {
|
|||||||
auto ty = this->m_type->codegen(builder, scope.structs);
|
auto ty = this->m_type->codegen(builder, scope.structs);
|
||||||
auto ptr = builder.builder->CreateAlloca(ty);
|
auto ptr = builder.builder->CreateAlloca(ty);
|
||||||
if (this->m_expr.has_value()) {
|
if (this->m_expr.has_value()) {
|
||||||
auto value = this->m_expr->get()->codegen(builder, scope);
|
auto value = this->m_expr->get()->codegen(builder, scope, allocator);
|
||||||
builder.builder->CreateStore(value.value, ptr, false);
|
builder.builder->CreateStore(value.value, ptr, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -500,13 +500,13 @@ namespace AST {
|
|||||||
scope.values[this->m_name] = codegen::StackValue{ ptr, ptr_ty };
|
scope.values[this->m_name] = codegen::StackValue{ ptr, ptr_ty };
|
||||||
}
|
}
|
||||||
|
|
||||||
void IfStatement::codegen(codegen::Builder& builder, codegen::Scope& scope) {
|
void IfStatement::codegen(codegen::Builder& builder, codegen::Scope& scope, codegen::StackAllocator& allocator) {
|
||||||
if (!builder.block)
|
if (!builder.block)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
builder.builder->SetInsertPoint(builder.block);
|
builder.builder->SetInsertPoint(builder.block);
|
||||||
|
|
||||||
auto condition = this->m_condition->codegen(builder, scope);
|
auto condition = this->m_condition->codegen(builder, scope, allocator);
|
||||||
|
|
||||||
auto function = builder.block->getParent();
|
auto function = builder.block->getParent();
|
||||||
auto then_block = llvm::BasicBlock::Create(*builder.context, "then", function);
|
auto then_block = llvm::BasicBlock::Create(*builder.context, "then", function);
|
||||||
@ -521,13 +521,13 @@ namespace AST {
|
|||||||
|
|
||||||
builder.block = then_block;
|
builder.block = then_block;
|
||||||
builder.builder->SetInsertPoint(then_block);
|
builder.builder->SetInsertPoint(then_block);
|
||||||
this->m_then->codegen(builder, scope);
|
this->m_then->codegen(builder, scope, allocator);
|
||||||
builder.builder->CreateBr(after_block);
|
builder.builder->CreateBr(after_block);
|
||||||
|
|
||||||
if (else_block.has_value()) {
|
if (else_block.has_value()) {
|
||||||
builder.block = *else_block;
|
builder.block = *else_block;
|
||||||
builder.builder->SetInsertPoint(*else_block);
|
builder.builder->SetInsertPoint(*else_block);
|
||||||
this->m_else->get()->codegen(builder, scope);
|
this->m_else->get()->codegen(builder, scope, allocator);
|
||||||
builder.builder->CreateBr(after_block);
|
builder.builder->CreateBr(after_block);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -605,7 +605,7 @@ namespace AST {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (auto& statement : *this->m_statements) {
|
for (auto& statement : *this->m_statements) {
|
||||||
statement->codegen(builder, inner_scope);
|
statement->codegen(builder, inner_scope, allocator);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user