2024-04-08 20:08:15 +02:00
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
2025-02-14 19:59:35 +01:00
|
|
|
#include <cstdlib>
|
2024-06-21 00:18:44 +02:00
|
|
|
#include <memory>
|
|
|
|
|
2024-04-08 20:08:15 +02:00
|
|
|
#include "llvm/IR/IRBuilder.h"
|
|
|
|
|
2025-02-14 19:59:35 +01:00
|
|
|
#include "bolt/ByteString.hpp"
|
|
|
|
|
2024-04-08 20:08:15 +02:00
|
|
|
namespace bolt {
|
|
|
|
|
2025-02-14 19:59:35 +01:00
|
|
|
class Checker;
|
|
|
|
class Type;
|
2024-04-08 20:08:15 +02:00
|
|
|
class Node;
|
|
|
|
class SourceFile;
|
|
|
|
class Expression;
|
2025-02-14 19:59:35 +01:00
|
|
|
class FunctionDeclaration;;
|
2024-04-08 20:08:15 +02:00
|
|
|
|
|
|
|
class LLVMCodeGen {
|
|
|
|
|
2025-02-14 19:59:35 +01:00
|
|
|
llvm::LLVMContext& TheContext;
|
2024-04-08 20:08:15 +02:00
|
|
|
|
2025-02-14 19:59:35 +01:00
|
|
|
Checker& TheChecker;
|
|
|
|
|
|
|
|
std::unordered_map<ByteString, llvm::Type*> Types;
|
2024-04-08 20:08:15 +02:00
|
|
|
|
2025-02-14 19:59:35 +01:00
|
|
|
unsigned int IntBitWidth;
|
|
|
|
llvm::Type* IntType;
|
|
|
|
llvm::Type* BoolType;
|
|
|
|
llvm::StructType* UnitType;
|
|
|
|
|
|
|
|
llvm::PointerType* StringType;
|
|
|
|
|
|
|
|
std::unique_ptr<llvm::IRBuilder<>> Builder;
|
2024-04-08 20:08:15 +02:00
|
|
|
|
|
|
|
public:
|
|
|
|
|
2025-02-14 19:59:35 +01:00
|
|
|
LLVMCodeGen(
|
|
|
|
llvm::LLVMContext& TheContext,
|
|
|
|
Checker& TheChecker
|
|
|
|
);
|
|
|
|
|
|
|
|
llvm::Value* generateExpression(Expression* Expr, llvm::BasicBlock* BB);
|
|
|
|
|
|
|
|
llvm::Type* generateType(Type* Ty);
|
|
|
|
|
|
|
|
void generateFunctionDeclaration(FunctionDeclaration* Decl, llvm::BasicBlock* BB);
|
2024-04-08 20:08:15 +02:00
|
|
|
|
2025-02-14 19:59:35 +01:00
|
|
|
void generateElement(Node* Element, llvm::BasicBlock* BB);
|
2024-04-08 20:08:15 +02:00
|
|
|
|
2025-02-14 19:59:35 +01:00
|
|
|
std::unique_ptr<llvm::Module> generate(SourceFile* SF);
|
2024-04-08 20:08:15 +02:00
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
}
|