55 lines · cpp
1#include "clang/CIR/Dialect/IR/CIRDataLayout.h"2#include "clang/CIR/Dialect/IR/CIRTypes.h"3#include "clang/CIR/MissingFeatures.h"4 5using namespace cir;6 7//===----------------------------------------------------------------------===//8// DataLayout Class Implementation9//===----------------------------------------------------------------------===//10 11CIRDataLayout::CIRDataLayout(mlir::ModuleOp modOp) : layout(modOp) {12 reset(modOp.getDataLayoutSpec());13}14 15void CIRDataLayout::reset(mlir::DataLayoutSpecInterface spec) {16 bigEndian = false;17 if (spec) {18 mlir::StringAttr key = mlir::StringAttr::get(19 spec.getContext(), mlir::DLTIDialect::kDataLayoutEndiannessKey);20 if (mlir::DataLayoutEntryInterface entry = spec.getSpecForIdentifier(key))21 if (auto str = llvm::dyn_cast<mlir::StringAttr>(entry.getValue()))22 bigEndian = str == mlir::DLTIDialect::kDataLayoutEndiannessBig;23 }24}25 26llvm::Align CIRDataLayout::getAlignment(mlir::Type ty, bool useABIAlign) const {27 // FIXME(cir): This does not account for differnt address spaces, and relies28 // on CIR's data layout to give the proper alignment.29 assert(!cir::MissingFeatures::addressSpace());30 31 // Fetch type alignment from MLIR's data layout.32 unsigned align = useABIAlign ? layout.getTypeABIAlignment(ty)33 : layout.getTypePreferredAlignment(ty);34 return llvm::Align(align);35}36 37// The implementation of this method is provided inline as it is particularly38// well suited to constant folding when called on a specific Type subclass.39llvm::TypeSize CIRDataLayout::getTypeSizeInBits(mlir::Type ty) const {40 assert(cir::isSized(ty) && "Cannot getTypeInfo() on a type that is unsized!");41 42 if (auto recordTy = llvm::dyn_cast<cir::RecordType>(ty)) {43 // FIXME(cir): CIR record's data layout implementation doesn't do a good job44 // of handling unions particularities. We should have a separate union type.45 return recordTy.getTypeSizeInBits(layout, {});46 }47 48 // FIXME(cir): This does not account for different address spaces, and relies49 // on CIR's data layout to give the proper ABI-specific type width.50 assert(!cir::MissingFeatures::addressSpace());51 52 // This is calling mlir::DataLayout::getTypeSizeInBits().53 return llvm::TypeSize::getFixed(layout.getTypeSizeInBits(ty));54}55