Add ArrayType
This commit is contained in:
parent
e797cab50f
commit
3370e76c48
@ -291,4 +291,11 @@ namespace types {
|
|||||||
llvm::Type* PointerType::codegen(codegen::Builder& builder) {
|
llvm::Type* PointerType::codegen(codegen::Builder& builder) {
|
||||||
return llvm::PointerType::get(*builder.context, 0);
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@ -143,6 +143,26 @@ namespace types {
|
|||||||
return 64;
|
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<types::Type> type1, std::shared_ptr<types::Type> type2) {
|
bool types_equal(std::shared_ptr<types::Type> type1, std::shared_ptr<types::Type> type2) {
|
||||||
if (type1->m_kind != type2->m_kind)
|
if (type1->m_kind != type2->m_kind)
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
18
src/types.h
18
src/types.h
@ -11,6 +11,7 @@ namespace types {
|
|||||||
Fundamental,
|
Fundamental,
|
||||||
Function,
|
Function,
|
||||||
Pointer,
|
Pointer,
|
||||||
|
Array,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum FundamentalTypeKind {
|
enum FundamentalTypeKind {
|
||||||
@ -67,11 +68,10 @@ namespace types {
|
|||||||
virtual uint32_t size() override;
|
virtual uint32_t size() override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class PointerType : public Type {
|
class PointerType : public Type {
|
||||||
public:
|
public:
|
||||||
std::shared_ptr<Type> m_inner;
|
std::shared_ptr<Type> m_inner;
|
||||||
|
|
||||||
PointerType(std::shared_ptr<Type> inner)
|
PointerType(std::shared_ptr<Type> inner)
|
||||||
: Type(TypeKind::Pointer), m_inner{ std::move(inner) } {
|
: Type(TypeKind::Pointer), m_inner{ std::move(inner) } {
|
||||||
}
|
}
|
||||||
@ -82,6 +82,20 @@ namespace types {
|
|||||||
virtual uint32_t size() override;
|
virtual uint32_t size() override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class ArrayType : public Type {
|
||||||
|
public:
|
||||||
|
std::shared_ptr<Type> m_inner;
|
||||||
|
std::optional<uint32_t> m_size;
|
||||||
|
|
||||||
|
ArrayType(std::shared_ptr<Type> inner, std::optional<uint32_t> 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<types::Type> type1, std::shared_ptr<types::Type> type2);
|
bool types_equal(std::shared_ptr<types::Type> type1, std::shared_ptr<types::Type> type2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
3
test.c
3
test.c
@ -12,6 +12,9 @@ void modify_value(char* otus) {
|
|||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
printf("10th fibonacci number is %d!", fibonacci(10));
|
printf("10th fibonacci number is %d!", fibonacci(10));
|
||||||
|
|
||||||
|
char somelist[5];
|
||||||
|
|
||||||
char res = 10;
|
char res = 10;
|
||||||
modify_value(&res);
|
modify_value(&res);
|
||||||
return res;
|
return res;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user