13#ifndef CIR_DIALECT_IR_CIRTYPESDETAILS_H
14#define CIR_DIALECT_IR_CIRTYPESDETAILS_H
16#include "mlir/IR/AttrTypeSubElements.h"
17#include "mlir/IR/BuiltinAttributes.h"
18#include "mlir/Support/LogicalResult.h"
20#include "llvm/ADT/Hashing.h"
59 assert((
name || !
incomplete) &&
"Incomplete records must have a name");
61 "every member must say what it holds");
92 llvm::LogicalResult
mutate(mlir::TypeStorageAllocator &allocator,
96 return llvm::failure();
102 return mlir::success((this->members ==
members) &&
103 (this->packed ==
packed) &&
104 (this->member_kinds == memberKinds));
108 if (memberKinds.size() !=
members.size())
109 return llvm::failure();
111 this->members = allocator.copyInto(
members);
113 this->member_kinds = allocator.copyInto(memberKinds);
115 return llvm::success();
152 assert((
name || !
incomplete) &&
"Incomplete records must have a name");
154 "every member must say what it holds");
171 return llvm::hash_combine(key.
name);
184 llvm::LogicalResult
mutate(mlir::TypeStorageAllocator &allocator,
189 return llvm::failure();
195 return mlir::success(
197 (this->padding ==
padding) && (this->member_kinds == memberKinds));
201 if (memberKinds.size() !=
members.size())
202 return llvm::failure();
204 this->members = allocator.copyInto(
members);
207 this->member_kinds = allocator.copyInto(memberKinds);
209 return llvm::success();
220struct AttrTypeSubElementHandler<
cir::detail::StructTypeStorage::KeyTy> {
222 AttrTypeImmediateSubElementWalker &walker) {
223 walker.walkRange(param.
members);
225 static FailureOr<cir::detail::StructTypeStorage::KeyTy>
227 AttrSubElementReplacements &attrRepls,
228 TypeSubElementReplacements &typeRepls) {
235 typeRepls.take_front(param.
members.size()), param.
name,
242struct AttrTypeSubElementHandler<
cir::detail::UnionTypeStorage::KeyTy> {
244 AttrTypeImmediateSubElementWalker &walker) {
245 walker.walkRange(param.
members);
248 static FailureOr<cir::detail::UnionTypeStorage::KeyTy>
250 AttrSubElementReplacements &attrRepls,
251 TypeSubElementReplacements &typeRepls) {
258 Type padding = param.
padding ? typeRepls.take_front(1)[0] : Type();
KeyTy(llvm::ArrayRef< mlir::Type > members, mlir::StringAttr name, bool incomplete, bool packed, llvm::ArrayRef< RecordMemberKind > member_kinds, bool is_class)
llvm::ArrayRef< RecordMemberKind > member_kinds
llvm::ArrayRef< mlir::Type > members
static llvm::hash_code hashKey(const KeyTy &key)
llvm::LogicalResult mutate(mlir::TypeStorageAllocator &allocator, llvm::ArrayRef< mlir::Type > members, bool packed, llvm::ArrayRef< RecordMemberKind > memberKinds)
Mutates the members and attributes of an identified struct/class.
llvm::ArrayRef< mlir::Type > members
static StructTypeStorage * construct(mlir::TypeStorageAllocator &allocator, const KeyTy &key)
bool operator==(const KeyTy &key) const
llvm::ArrayRef< RecordMemberKind > member_kinds
StructTypeStorage(llvm::ArrayRef< mlir::Type > members, mlir::StringAttr name, bool incomplete, bool packed, llvm::ArrayRef< RecordMemberKind > member_kinds, bool is_class)
llvm::ArrayRef< RecordMemberKind > member_kinds
llvm::ArrayRef< mlir::Type > members
KeyTy(llvm::ArrayRef< mlir::Type > members, mlir::StringAttr name, bool incomplete, bool packed, mlir::Type padding, llvm::ArrayRef< RecordMemberKind > member_kinds)
llvm::ArrayRef< mlir::Type > members
bool operator==(const KeyTy &key) const
static llvm::hash_code hashKey(const KeyTy &key)
static UnionTypeStorage * construct(mlir::TypeStorageAllocator &allocator, const KeyTy &key)
llvm::ArrayRef< RecordMemberKind > member_kinds
llvm::LogicalResult mutate(mlir::TypeStorageAllocator &allocator, llvm::ArrayRef< mlir::Type > members, bool packed, mlir::Type padding, llvm::ArrayRef< RecordMemberKind > memberKinds)
Mutates the members and attributes of an identified union.
UnionTypeStorage(llvm::ArrayRef< mlir::Type > members, mlir::StringAttr name, bool incomplete, bool packed, mlir::Type padding, llvm::ArrayRef< RecordMemberKind > member_kinds)
static void walk(const cir::detail::StructTypeStorage::KeyTy ¶m, AttrTypeImmediateSubElementWalker &walker)
static FailureOr< cir::detail::StructTypeStorage::KeyTy > replace(const cir::detail::StructTypeStorage::KeyTy ¶m, AttrSubElementReplacements &attrRepls, TypeSubElementReplacements &typeRepls)
static void walk(const cir::detail::UnionTypeStorage::KeyTy ¶m, AttrTypeImmediateSubElementWalker &walker)
static FailureOr< cir::detail::UnionTypeStorage::KeyTy > replace(const cir::detail::UnionTypeStorage::KeyTy ¶m, AttrSubElementReplacements &attrRepls, TypeSubElementReplacements &typeRepls)