mini-llvm 0.1.0
Loading...
Searching...
No Matches
ArrayType.h
Go to the documentation of this file.
1// SPDX-License-Identifier: MIT
2
3#pragma once
4
5#include <cstddef>
6#include <cstdint>
7#include <cstdlib>
8#include <format>
9#include <memory>
10#include <string>
11#include <utility>
12
14#include "mini-llvm/ir/Type.h"
17
18namespace mini_llvm::ir {
19
20class MINI_LLVM_EXPORT ArrayType final : public Type {
21public:
22 ArrayType(std::unique_ptr<Type> elementType, size_t numElements)
23 : elementType_(std::move(elementType)), numElements_(numElements) {}
24
25 std::unique_ptr<Type> elementType() const {
26 return elementType_->clone();
27 }
28
29 size_t numElements() const {
30 return numElements_;
31 }
32
33 int size() const override {
34 return static_cast<int>(numElements()) * elementType()->size();
35 }
36
37 int alignment() const override {
38 return elementType()->alignment();
39 }
40
41 int size(int pointerSize) const override {
42 return static_cast<int>(numElements()) * elementType()->size(pointerSize);
43 }
44
45 int alignment(int pointerAlignment) const override {
46 return elementType()->alignment(pointerAlignment);
47 }
48
49 std::unique_ptr<Constant> zeroValue() const override;
50
51 std::unique_ptr<Constant> constant(int64_t) const override {
52 abort();
53 }
54
55 std::unique_ptr<Type> promoted() const override {
56 abort();
57 }
58
59 std::unique_ptr<Type> demoted() const override {
60 abort();
61 }
62
63 std::string format() const override {
64 return std::format("[{} x {}]", numElements(), *elementType());
65 }
66
67 std::unique_ptr<Type> clone() const override {
68 return std::make_unique<ArrayType>(elementType(), numElements());
69 }
70
71 void accept(TypeVisitor &visitor) override {
72 visitor.visitArrayType(*this);
73 }
74
75 void accept(TypeVisitor &visitor) const override {
76 visitor.visitArrayType(*this);
77 }
78
79protected:
80 bool equals(const Type &other) const override;
81
82private:
83 std::unique_ptr<Type> elementType_;
84 size_t numElements_;
85};
86
87} // namespace mini_llvm::ir
#define MINI_LLVM_EXPORT
Definition Compiler.h:17
std::string format() const override
Definition ArrayType.h:63
void accept(TypeVisitor &visitor) override
Definition ArrayType.h:71
bool equals(const Type &other) const override
size_t numElements() const
Definition ArrayType.h:29
int alignment() const override
Definition ArrayType.h:37
std::unique_ptr< Type > promoted() const override
Definition ArrayType.h:55
int size() const override
Definition ArrayType.h:33
std::unique_ptr< Type > demoted() const override
Definition ArrayType.h:59
std::unique_ptr< Constant > zeroValue() const override
std::unique_ptr< Constant > constant(int64_t) const override
Definition ArrayType.h:51
ArrayType(std::unique_ptr< Type > elementType, size_t numElements)
Definition ArrayType.h:22
std::unique_ptr< Type > clone() const override
Definition ArrayType.h:67
void accept(TypeVisitor &visitor) const override
Definition ArrayType.h:75
int size(int pointerSize) const override
Definition ArrayType.h:41
std::unique_ptr< Type > elementType() const
Definition ArrayType.h:25
int alignment(int pointerAlignment) const override
Definition ArrayType.h:45
Definition TypeVisitor.h:25
virtual void visitArrayType(ArrayType &type)
Definition TypeVisitor.h:37
Definition Argument.h:13