diff --git a/clang/include/clang/CIR/Dialect/IR/CIRTypes.td b/clang/include/clang/CIR/Dialect/IR/CIRTypes.td index ee8b266ed962..19c740271584 100644 --- a/clang/include/clang/CIR/Dialect/IR/CIRTypes.td +++ b/clang/include/clang/CIR/Dialect/IR/CIRTypes.td @@ -194,9 +194,20 @@ def CIR_PointerType : CIR_Type<"Pointer", "ptr", `CIR.ptr` is a type returned by any op generating a pointer in C++. }]; - let parameters = (ins "mlir::Type":$pointee); + let parameters = (ins "mlir::Type":$pointee, "unsigned":$addrSpace); - let assemblyFormat = "`<` $pointee `>`"; + let builders = [ + TypeBuilderWithInferredContext<(ins "mlir::Type":$pointee, CArg<"unsigned", "0">:$addrSpace), [{ + return Base::get(pointee.getContext(), pointee, addrSpace); + }]>, + TypeBuilder<(ins "mlir::Type":$pointee, CArg<"unsigned", "0">:$addrSpace), [{ + return Base::get($_ctxt, pointee, addrSpace); + }]>, + ]; + + let hasCustomAssemblyFormat = 1; + + let skipDefaultBuilders = 1; let extraClassDeclaration = [{ bool isVoidPtr() const { diff --git a/clang/lib/CIR/CodeGen/CIRGenTypes.cpp b/clang/lib/CIR/CodeGen/CIRGenTypes.cpp index 157d68435571..53787563eb94 100644 --- a/clang/lib/CIR/CodeGen/CIRGenTypes.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenTypes.cpp @@ -598,9 +598,9 @@ mlir::Type CIRGenTypes::ConvertType(QualType T) { const ReferenceType *RTy = cast(Ty); QualType ETy = RTy->getPointeeType(); auto PointeeType = convertTypeForMem(ETy); - // TODO(cir): use Context.getTargetAddressSpace(ETy) on pointer - ResultType = - ::mlir::cir::PointerType::get(Builder.getContext(), PointeeType); + ResultType = ::mlir::cir::PointerType::get( + Builder.getContext(), PointeeType, + Context.getTargetAddressSpace(ETy.getAddressSpace())); assert(ResultType && "Cannot get pointer type?"); break; } @@ -615,9 +615,9 @@ mlir::Type CIRGenTypes::ConvertType(QualType T) { // if (PointeeType->isVoidTy()) // PointeeType = Builder.getI8Type(); - // FIXME: add address specifier to cir::PointerType? - ResultType = - ::mlir::cir::PointerType::get(Builder.getContext(), PointeeType); + ResultType = ::mlir::cir::PointerType::get( + Builder.getContext(), PointeeType, + Context.getTargetAddressSpace(ETy.getAddressSpace())); assert(ResultType && "Cannot get pointer type?"); break; } diff --git a/clang/lib/CIR/Dialect/IR/CIRTypes.cpp b/clang/lib/CIR/Dialect/IR/CIRTypes.cpp index 67f6dcf83d82..cc7a65cdf0c1 100644 --- a/clang/lib/CIR/Dialect/IR/CIRTypes.cpp +++ b/clang/lib/CIR/Dialect/IR/CIRTypes.cpp @@ -96,6 +96,32 @@ void CIRDialect::printType(Type type, DialectAsmPrinter &os) const { }); } +Type PointerType::parse(mlir::AsmParser &parser) { + if (parser.parseLess()) + return Type(); + Type pointeeType; + unsigned addrSpace = 0; + if (parser.parseType(pointeeType)) + return Type(); + if (parser.parseOptionalComma().succeeded()) { + if (parser.parseInteger(addrSpace)) + return Type(); + } + if (parser.parseGreater()) + return Type(); + return get(parser.getContext(), pointeeType, addrSpace); +} + +void PointerType::print(mlir::AsmPrinter &printer) const { + printer << '<'; + printer.printType(getPointee()); + if (auto addrSpace = getAddrSpace()) { + printer << ", "; + printer << addrSpace; + } + printer << '>'; +} + Type BoolType::parse(mlir::AsmParser &parser) { return get(parser.getContext()); }