From 2c1b91e0abbb01b25413096eecba1a0a11f68fae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Grodzi=C5=84ski?= Date: Fri, 30 May 2025 22:32:04 +0900 Subject: [PATCH] Expression execution seems to be working --- make.sh | 2 +- src/Compiler.cpp | 42 ++++++++++++++++++++++++++++++++++++++++++ src/Compiler.h | 28 ++++++++++++++++++++++++++++ src/Expression.cpp | 16 ++++++++++++++++ src/Expression.h | 8 ++++++-- src/main.cpp | 8 ++++++++ 6 files changed, 101 insertions(+), 3 deletions(-) create mode 100644 src/Compiler.cpp create mode 100644 src/Compiler.h diff --git a/make.sh b/make.sh index 37c25dc..70c4b44 100755 --- a/make.sh +++ b/make.sh @@ -1,3 +1,3 @@ #!/bin/bash -cc -g -std=c++17 -lc++ src/*.cpp -o brb \ No newline at end of file +cc -g -std=c++17 -lc++ -lllvm -DLLVM_DISABLE_ABI_BREAKING_CHECKS_ENFORCING=1 -L/usr/local/opt/llvm/lib -I/usr/local/opt/llvm/include src/*.cpp -o brb \ No newline at end of file diff --git a/src/Compiler.cpp b/src/Compiler.cpp new file mode 100644 index 0000000..6a72c6b --- /dev/null +++ b/src/Compiler.cpp @@ -0,0 +1,42 @@ +#include "Compiler.h" +#include "llvm/IR/LLVMContext.h" +#include "llvm/IR/Constants.h" +#include "llvm/Support/raw_ostream.h" + +Compiler::Compiler(shared_ptr expression): expression(expression) { + context = make_shared(); + module = make_shared("dummy", *context); + builder = make_shared>(*context); + + //int32Type = shared_ptr(llvm::Type::getInt32Ty(context)); + int32Type = llvm::Type::getInt32Ty(*context); +} + +llvm::Value *Compiler::valueForExpression(shared_ptr expression) { + switch (expression->getKind()) { + case Expression::Kind::LITERAL: + return llvm::ConstantInt::get(int32Type, expression->getInteger(), true); + case Expression::Kind::BINARY: + llvm::Value *leftValue = valueForExpression(expression->getLeft()); + llvm::Value *rightValue = valueForExpression(expression->getRight()); + switch (expression->getOperator()) { + case Expression::Operator::ADD: + return builder->CreateNSWAdd(leftValue, rightValue); + case Expression::Operator::SUB: + return builder->CreateNSWSub(leftValue, rightValue); + case Expression::Operator::MUL: + return builder->CreateNSWMul(leftValue, rightValue); + case Expression::Operator::DIV: + return builder->CreateSDiv(leftValue, rightValue); + case Expression::Operator::MOD: + return builder->CreateSRem(leftValue, rightValue); + } + break; + } +} + +shared_ptr Compiler::getModule() { + llvm::Value *value = valueForExpression(expression); + value->print(llvm::outs(), false); + return module; +} \ No newline at end of file diff --git a/src/Compiler.h b/src/Compiler.h new file mode 100644 index 0000000..1f7991b --- /dev/null +++ b/src/Compiler.h @@ -0,0 +1,28 @@ +#ifndef COMPILER_H +#define COMPILER_H + +#include "llvm/IR/Module.h" +#include "llvm/IR/IRBuilder.h" +#include "Expression.h" + +using namespace std; + +class Compiler { +private: + shared_ptr context; + //llvm::LLVMContext context; + shared_ptr module; + shared_ptr> builder; + + //shared_ptr int32Type; + llvm::IntegerType *int32Type; + + shared_ptr expression; + llvm::Value *valueForExpression(shared_ptr expression); + +public: + Compiler(shared_ptr expression); + shared_ptr getModule(); +}; + +#endif \ No newline at end of file diff --git a/src/Expression.cpp b/src/Expression.cpp index 7d14064..36f5872 100644 --- a/src/Expression.cpp +++ b/src/Expression.cpp @@ -62,6 +62,22 @@ Expression::Kind Expression::getKind() { return kind; } +int64_t Expression::getInteger() { + return integer; +} + +Expression::Operator Expression::getOperator() { + return operation; +} + +shared_ptr Expression::getLeft() { + return left; +} + +shared_ptr Expression::getRight() { + return right; +} + bool Expression::operator==(Expression const& other) { return kind == other.kind; } diff --git a/src/Expression.h b/src/Expression.h index d74ae7f..bbb0e5a 100644 --- a/src/Expression.h +++ b/src/Expression.h @@ -13,7 +13,7 @@ public: INVALID }; - enum Operation { + enum Operator { ADD, SUB, MUL, @@ -25,7 +25,7 @@ public: private: Kind kind = INVALID; int64_t integer = 0; - Operation operation = NONE; + Operator operation = NONE; shared_ptr left = nullptr; shared_ptr right = nullptr; @@ -35,6 +35,10 @@ private: public: Expression(Kind kind, Token token, shared_ptr left, shared_ptr right); Kind getKind(); + int64_t getInteger(); + Operator getOperator(); + shared_ptr getLeft(); + shared_ptr getRight(); bool operator==(Expression const& other); bool operator!=(Expression const& other); string toString(); diff --git a/src/main.cpp b/src/main.cpp index ffeaa50..2441ef6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -6,6 +6,9 @@ #include "Expression.h" #include "Parser.h" +#include "Compiler.h" + +#include "llvm/Support/raw_ostream.h" using namespace std; @@ -40,5 +43,10 @@ int main(int argc, char **argv) { shared_ptr expression = parser.getExpression(); cout << expression->toString() << endl; + Compiler compiler(expression); + compiler.getModule(); + shared_ptr module = compiler.getModule(); + module->print(llvm::outs(), nullptr); + return 0; } \ No newline at end of file