From 1aa785efc3210f4cc51c43fab8e5f4ed0fc3d7e9 Mon Sep 17 00:00:00 2001 From: rain2133 <1370973498@qq.com> Date: Mon, 16 Jun 2025 20:56:32 +0800 Subject: [PATCH] add arraytype def --- src/IR.cpp | 2 ++ src/IR.h | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/src/IR.cpp b/src/IR.cpp index 318b8c8..529e903 100644 --- a/src/IR.cpp +++ b/src/IR.cpp @@ -91,6 +91,8 @@ int Type::getSize() const { return 8; case kVoid: return 0; + case kArray: + return asArrayType()->getArraySize(); } return 0; } diff --git a/src/IR.h b/src/IR.h index 184c7f4..1483395 100644 --- a/src/IR.h +++ b/src/IR.h @@ -42,6 +42,7 @@ public: kLabel, kPointer, kFunction, + kArray, }; Kind kind; @@ -57,6 +58,9 @@ public: static Type *getPointerType(Type *baseType); static Type *getFunctionType(Type *returnType, const std::vector ¶mTypes = {}); + static Type *getArrayType(Type *elementType, const std::vector &dims = {}) { + return ArrayType::get(elementType, dims); + } public: Kind getKind() const { return kind; } @@ -66,8 +70,12 @@ public: bool isLabel() const { return kind == kLabel; } bool isPointer() const { return kind == kPointer; } bool isFunction() const { return kind == kFunction; } + bool isArray() const { return kind == kArray; } bool isIntOrFloat() const { return kind == kInt or kind == kFloat; } int getSize() const; + ArrayType *asArrayType() const { + return isArray() ? static_cast(const_cast(this)) : nullptr; + } template std::enable_if_t, T *> as() const { return dynamic_cast(const_cast(this)); @@ -110,6 +118,47 @@ public: int getNumParams() const { return paramTypes.size(); } }; // class FunctionType +class ArrayType : public Type { +private: + Type *elementType; // 数组元素类型 + std::vector dimensions; // 维度信息(空向量表示未知大小) + +protected: + ArrayType(Type *elemType, const std::vector &dims = {}) + : Type(kArray), elementType(elemType), dimensions(dims) { + // 确保元素类型有效 + assert(elemType && "Array element type cannot be null"); + assert(!elemType->isVoid() && "Cannot have array of void"); + assert(!elemType->isLabel() && "Cannot have array of labels"); + } + +public: + // 获取数组类型(带缓存机制) + static ArrayType *get(Type *elemType, const std::vector &dims = {}) { + // 实现类型缓存池(避免重复创建) + static std::map>, ArrayType*> cache; + + auto key = std::make_pair(elemType, dims); + if (cache.find(key) == cache.end()) { + cache[key] = new ArrayType(elemType, dims); + } + return cache[key]; + } + + Type *getElementType() const { return elementType; } + const std::vector& getDimensions() const { return dimensions; } + size_t getNumDimensions() const { return dimensions.size(); } + + int getArraySize() const { + int size = elementType->getSize(); + for (int dim : dimensions) { + size *= dim; + } + return size; + } + +};//class ArrayType + /*! * @} */