25#include "mlir/Dialect/LLVMIR/LLVMDialect.h"
26#include "llvm/Support/ErrorHandling.h"
32class LowerItaniumCXXABI :
public CIRCXXABI {
34 LowerItaniumCXXABI(LowerModule &lm) : CIRCXXABI(lm) {}
39 lowerDataMemberType(cir::DataMemberType type,
40 const mlir::TypeConverter &typeConverter)
const override;
42 mlir::TypedAttr lowerDataMemberConstant(
43 cir::DataMemberAttr attr,
const mlir::DataLayout &layout,
44 const mlir::TypeConverter &typeConverter)
const override;
47 lowerGetRuntimeMember(cir::GetRuntimeMemberOp op, mlir::Type loweredResultTy,
48 mlir::Value loweredAddr, mlir::Value loweredMember,
49 mlir::OpBuilder &builder)
const override;
55 return std::make_unique<LowerItaniumCXXABI>(lm);
66mlir::Type LowerItaniumCXXABI::lowerDataMemberType(
67 cir::DataMemberType type,
const mlir::TypeConverter &typeConverter)
const {
71 return getPtrDiffCIRTy(lm);
74mlir::TypedAttr LowerItaniumCXXABI::lowerDataMemberConstant(
75 cir::DataMemberAttr attr,
const mlir::DataLayout &layout,
76 const mlir::TypeConverter &typeConverter)
const {
78 if (
attr.isNullPtr()) {
86 unsigned memberIndex =
attr.getMemberIndex().value();
88 attr.getType().getClassTy().getElementOffset(layout, memberIndex);
91 mlir::Type abiTy = lowerDataMemberType(
attr.getType(), typeConverter);
92 return cir::IntAttr::get(abiTy, memberOffset);
95mlir::Operation *LowerItaniumCXXABI::lowerGetRuntimeMember(
96 cir::GetRuntimeMemberOp op, mlir::Type loweredResultTy,
97 mlir::Value loweredAddr, mlir::Value loweredMember,
98 mlir::OpBuilder &builder)
const {
99 auto byteTy = cir::IntType::get(op.getContext(), 8,
true);
100 auto bytePtrTy = cir::PointerType::get(
102 mlir::cast<cir::PointerType>(op.getAddr().getType()).getAddrSpace());
103 auto objectBytesPtr = cir::CastOp::create(
104 builder, op.getLoc(), bytePtrTy, cir::CastKind::bitcast, op.getAddr());
105 auto memberBytesPtr = cir::PtrStrideOp::create(
106 builder, op.getLoc(), bytePtrTy, objectBytesPtr, loweredMember);
107 return cir::CastOp::create(builder, op.getLoc(), op.getType(),
108 cir::CastKind::bitcast, memberBytesPtr);
mlir::MLIRContext * getMLIRContext()
const clang::TargetInfo & getTarget() const
Exposes information about the current target.
unsigned getTypeWidth(IntType T) const
Return the width (in bits) of the specified integer type enum.
static bool isTypeSigned(IntType T)
Returns true if the type is signed; false otherwise.
IntType getPtrDiffType(LangAS AddrSpace) const
std::unique_ptr< CIRCXXABI > createItaniumCXXABI(LowerModule &lm)
Creates an Itanium-family ABI.
static cir::IntType getPtrDiffCIRTy(LowerModule &lm)
const internal::VariadicAllOfMatcher< Attr > attr
IntType
===-— Target Data Type Query Methods ----------------------------—===//