diff --git a/src/codegen.cpp b/src/codegen.cpp index ddb929a..ac30932 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -291,4 +291,11 @@ namespace types { llvm::Type* PointerType::codegen(codegen::Builder& builder) { return llvm::PointerType::get(*builder.context, 0); } + + llvm::Type* ArrayType::codegen(codegen::Builder& builder) { + if (this->m_size) { + return llvm::ArrayType::get(this->m_inner->codegen(builder), *this->m_size); + } + return llvm::PointerType::get(*builder.context, 0); + } } \ No newline at end of file diff --git a/src/types.cpp b/src/types.cpp index 1e0d19f..7235a8f 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -143,6 +143,26 @@ namespace types { return 64; } + std::string ArrayType::formatted() { + std::stringstream out{ "" }; + out << this->m_inner->formatted(); + if (this->m_size) + out << "[" << *this->m_size << "]"; + else + out << "[]"; + return out.str(); + } + + uint32_t ArrayType::size() { + if (this->m_size) { + return (*this->m_size) * this->m_inner->size(); + } + else { + // Acts as a pointer type otherwise + return 64; + } + } + bool types_equal(std::shared_ptr type1, std::shared_ptr type2) { if (type1->m_kind != type2->m_kind) return false; diff --git a/src/types.h b/src/types.h index 3090ff9..29994bf 100644 --- a/src/types.h +++ b/src/types.h @@ -11,6 +11,7 @@ namespace types { Fundamental, Function, Pointer, + Array, }; enum FundamentalTypeKind { @@ -67,11 +68,10 @@ namespace types { virtual uint32_t size() override; }; - - class PointerType : public Type { public: std::shared_ptr m_inner; + PointerType(std::shared_ptr inner) : Type(TypeKind::Pointer), m_inner{ std::move(inner) } { } @@ -82,6 +82,20 @@ namespace types { virtual uint32_t size() override; }; + class ArrayType : public Type { + public: + std::shared_ptr m_inner; + std::optional m_size; + + ArrayType(std::shared_ptr inner, std::optional size) + : Type(TypeKind::Array), m_inner{ std::move(inner) }, m_size{ size } { + } + virtual ~ArrayType() override = default; + virtual std::string formatted() override; + virtual llvm::Type* codegen(codegen::Builder& builder) override; + virtual uint32_t size() override; + }; + bool types_equal(std::shared_ptr type1, std::shared_ptr type2); } diff --git a/test.c b/test.c index 7d3bb52..918bbf5 100644 --- a/test.c +++ b/test.c @@ -12,6 +12,9 @@ void modify_value(char* otus) { int main() { printf("10th fibonacci number is %d!", fibonacci(10)); + + char somelist[5]; + char res = 10; modify_value(&res); return res;