Skip to content

Commit

Permalink
[CIR][CIRGen] Add address space for Pointer type
Browse files Browse the repository at this point in the history
  • Loading branch information
seven-mile committed May 15, 2024
1 parent 3bad644 commit e93d6d7
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 8 deletions.
15 changes: 13 additions & 2 deletions clang/include/clang/CIR/Dialect/IR/CIRTypes.td
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
12 changes: 6 additions & 6 deletions clang/lib/CIR/CodeGen/CIRGenTypes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -598,9 +598,9 @@ mlir::Type CIRGenTypes::ConvertType(QualType T) {
const ReferenceType *RTy = cast<ReferenceType>(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;
}
Expand All @@ -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;
}
Expand Down
26 changes: 26 additions & 0 deletions clang/lib/CIR/Dialect/IR/CIRTypes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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());
}
Expand Down

0 comments on commit e93d6d7

Please sign in to comment.