@@ -606,6 +606,38 @@ def CIR_VTableAttr : CIR_Attr<"VTable", "vtable", [TypedAttrInterface]> {
606606//===----------------------------------------------------------------------===//
607607
608608def CIR_AddressSpaceAttr : CIR_EnumAttr<CIR_AddressSpace, "address_space"> {
609+ let summary = "Attribute representing memory address spaces";
610+ let description = [{
611+ Represents different memory address spaces for pointer types.
612+ Address spaces distinguish between different types of memory regions,
613+ such as global, local, or constant memory.
614+
615+ The `value` parameter is an extensible enum, which encodes target address
616+ space as an offset to the last language address space. For that reason, the
617+ attribute is implemented as custom AddressSpaceAttr, which provides custom
618+ printer and parser for the `value` parameter.
619+
620+ CIR supports two categories:
621+ - Language address spaces: Predefined spaces like `offload_global`,
622+ `offload_constant`, `offload_private` for offload programming models
623+ - Target address spaces: Numeric spaces `target<N>` for target-specific
624+ memory regions, where N is the address space number
625+
626+ Examples:
627+ ```mlir
628+ // Default address space (implicit)
629+ !cir.ptr<!s32i>
630+
631+ // Language-defined offload address spaces
632+ !cir.ptr<!s32i, addrspace(offload_global)>
633+ !cir.ptr<!s32i, addrspace(offload_constant)>
634+ !cir.ptr<!s32i, addrspace(offload_private)>
635+
636+ // Target-specific numeric address spaces
637+ !cir.ptr<!s32i, addrspace(target<1>)>
638+ !cir.ptr<!s32i, addrspace(target<10>)>
639+ ```
640+ }];
609641 let builders = [
610642 AttrBuilder<(ins "clang::LangAS":$langAS), [{
611643 return $_get($_ctxt, cir::toCIRAddressSpace(langAS));
0 commit comments