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;
43 lowerMethodType(cir::MethodType type,
44 const mlir::TypeConverter &typeConverter)
const override;
46 mlir::TypedAttr lowerDataMemberConstant(
47 cir::DataMemberAttr attr,
const mlir::DataLayout &layout,
48 const mlir::TypeConverter &typeConverter)
const override;
51 lowerGetRuntimeMember(cir::GetRuntimeMemberOp op, mlir::Type loweredResultTy,
52 mlir::Value loweredAddr, mlir::Value loweredMember,
53 mlir::OpBuilder &builder)
const override;
59 return std::make_unique<LowerItaniumCXXABI>(lm);
70mlir::Type LowerItaniumCXXABI::lowerDataMemberType(
71 cir::DataMemberType type,
const mlir::TypeConverter &typeConverter)
const {
75 return getPtrDiffCIRTy(lm);
78mlir::Type LowerItaniumCXXABI::lowerMethodType(
79 cir::MethodType type,
const mlir::TypeConverter &typeConverter)
const {
94 return cir::RecordType::get(
type.getContext(), {ptrdiffCIRTy, ptrdiffCIRTy},
96 cir::RecordType::Struct);
99mlir::TypedAttr LowerItaniumCXXABI::lowerDataMemberConstant(
100 cir::DataMemberAttr attr,
const mlir::DataLayout &layout,
101 const mlir::TypeConverter &typeConverter)
const {
103 if (
attr.isNullPtr()) {
106 memberOffset = -1ull;
111 unsigned memberIndex =
attr.getMemberIndex().value();
113 attr.getType().getClassTy().getElementOffset(layout, memberIndex);
116 mlir::Type abiTy = lowerDataMemberType(
attr.getType(), typeConverter);
117 return cir::IntAttr::get(abiTy, memberOffset);
120mlir::Operation *LowerItaniumCXXABI::lowerGetRuntimeMember(
121 cir::GetRuntimeMemberOp op, mlir::Type loweredResultTy,
122 mlir::Value loweredAddr, mlir::Value loweredMember,
123 mlir::OpBuilder &builder)
const {
124 auto byteTy = cir::IntType::get(op.getContext(), 8,
true);
125 auto bytePtrTy = cir::PointerType::get(
127 mlir::cast<cir::PointerType>(op.getAddr().getType()).getAddrSpace());
128 auto objectBytesPtr = cir::CastOp::create(
129 builder, op.getLoc(), bytePtrTy, cir::CastKind::bitcast, op.getAddr());
130 auto memberBytesPtr = cir::PtrStrideOp::create(
131 builder, op.getLoc(), bytePtrTy, objectBytesPtr, loweredMember);
132 return cir::CastOp::create(builder, op.getLoc(), op.getType(),
133 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
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
IntType
===-— Target Data Type Query Methods ----------------------------—===//