Attributes


ASTCXXConstructorDeclAttr

Wraps a ‘const clang::CXXConstructorDecl *' AST node.

Operations optionally refer to this node, they could be available depending on the CIR lowering stage. Whether it's attached to the appropriated CIR operation is delegated to the operation verifier.

This always implies a non-null AST reference (verified).

Parameters:

Parameter C++ type Description
ast const clang::CXXConstructorDecl *  

ASTCXXConversionDeclAttr

Wraps a ‘const clang::CXXConversionDecl *' AST node.

Operations optionally refer to this node, they could be available depending on the CIR lowering stage. Whether it's attached to the appropriated CIR operation is delegated to the operation verifier.

This always implies a non-null AST reference (verified).

Parameters:

Parameter C++ type Description
ast const clang::CXXConversionDecl *  

ASTCXXDestructorDeclAttr

Wraps a ‘const clang::CXXDestructorDecl *' AST node.

Operations optionally refer to this node, they could be available depending on the CIR lowering stage. Whether it's attached to the appropriated CIR operation is delegated to the operation verifier.

This always implies a non-null AST reference (verified).

Parameters:

Parameter C++ type Description
ast const clang::CXXDestructorDecl *  

ASTCXXMethodDeclAttr

Wraps a ‘const clang::CXXMethodDecl *' AST node.

Operations optionally refer to this node, they could be available depending on the CIR lowering stage. Whether it's attached to the appropriated CIR operation is delegated to the operation verifier.

This always implies a non-null AST reference (verified).

Parameters:

Parameter C++ type Description
ast const clang::CXXMethodDecl *  

ASTCallExprAttr

Wraps a ‘const clang::CallExpr *' AST node.

Operations optionally refer to this node, they could be available depending on the CIR lowering stage. Whether it's attached to the appropriated CIR operation is delegated to the operation verifier.

This always implies a non-null AST reference (verified).

Parameters:

Parameter C++ type Description
ast const clang::CallExpr *  

ASTDeclAttr

Wraps a ‘const clang::Decl *' AST node.

Operations optionally refer to this node, they could be available depending on the CIR lowering stage. Whether it's attached to the appropriated CIR operation is delegated to the operation verifier.

This always implies a non-null AST reference (verified).

Parameters:

Parameter C++ type Description
ast const clang::Decl *  

ASTExprAttr

Wraps a ‘const clang::Expr *' AST node.

Operations optionally refer to this node, they could be available depending on the CIR lowering stage. Whether it's attached to the appropriated CIR operation is delegated to the operation verifier.

This always implies a non-null AST reference (verified).

Parameters:

Parameter C++ type Description
ast const clang::Expr *  

ASTFunctionDeclAttr

Wraps a ‘const clang::FunctionDecl *' AST node.

Operations optionally refer to this node, they could be available depending on the CIR lowering stage. Whether it's attached to the appropriated CIR operation is delegated to the operation verifier.

This always implies a non-null AST reference (verified).

Parameters:

Parameter C++ type Description
ast const clang::FunctionDecl *  

ASTRecordDeclAttr

Wraps a ‘const clang::RecordDecl *' AST node.

Operations optionally refer to this node, they could be available depending on the CIR lowering stage. Whether it's attached to the appropriated CIR operation is delegated to the operation verifier.

This always implies a non-null AST reference (verified).

Parameters:

Parameter C++ type Description
ast const clang::RecordDecl *  

ASTTagDeclAttr

Wraps a ‘const clang::TagDecl *' AST node.

Operations optionally refer to this node, they could be available depending on the CIR lowering stage. Whether it's attached to the appropriated CIR operation is delegated to the operation verifier.

This always implies a non-null AST reference (verified).

Parameters:

Parameter C++ type Description
ast const clang::TagDecl *  

ASTTypeDeclAttr

Wraps a ‘const clang::TypeDecl *' AST node.

Operations optionally refer to this node, they could be available depending on the CIR lowering stage. Whether it's attached to the appropriated CIR operation is delegated to the operation verifier.

This always implies a non-null AST reference (verified).

Parameters:

Parameter C++ type Description
ast const clang::TypeDecl *  

ASTVarDeclAttr

Wraps a ‘const clang::VarDecl *' AST node.

Operations optionally refer to this node, they could be available depending on the CIR lowering stage. Whether it's attached to the appropriated CIR operation is delegated to the operation verifier.

This always implies a non-null AST reference (verified).

Parameters:

Parameter C++ type Description
ast const clang::VarDecl *  

AddressSpaceAttr

Address space attribute for pointer types

Syntax:

#cir.addrspace<
  int32_t   # value
>

The address space attribute is used in pointer types. It essentially provides a unified model on top of clang::LangAS, rather than LLVM address spaces.

The representation is further simplified: LangAS::Default is encoded as a null attribute; many address spaces from different offloading languages are unified as offload_*; etc.

The meaning of value parameter is defined as an extensible enum Kind, which encodes target AS as offset to the last language AS.

Parameters:

Parameter C++ type Description
value int32_t  

AnnotationAttr

Annotation attribute for global variables and functions

Syntax:

#cir.annotation<
  mlir::StringAttr,   # name
  mlir::ArrayAttr   # args
>

Represent C/C++ attribute of annotate in CIR. Example C code:

 int *a __attribute__((annotate("testptr", "21", 12 )));

In this example code, the AnnotationAttr has annotation name "testptr", and arguments "21" and 12 constitutes an ArrayAttr type parameter args for global variable a. In CIR, the attribute for above annotation looks like:

[#cir.annotation<name = "withargs", args = ["21", 12 : i32]>]

Parameters:

Parameter C++ type Description
name mlir::StringAttr  
args mlir::ArrayAttr  

BitfieldInfoAttr

Represents a bit field info

Syntax:

#cir.bitfield_info<
  mlir::StringAttr,   # name
  mlir::Type,   # storage_type
  uint64_t,   # size
  uint64_t,   # offset
  bool   # is_signed
>

Holds the next information about bitfields: name, storage type, a bitfield size and position in the storage, if the bitfield is signed or not.

Parameters:

Parameter C++ type Description
name mlir::StringAttr  
storage_type mlir::Type  
size uint64_t  
offset uint64_t  
is_signed bool  

BoolAttr

Represent true/false for !cir.bool types

Syntax:

#cir.bool<
  cir::BoolType,   # type
  bool   # value
>

The BoolAttr represents a ‘true' or ‘false' value.

Parameters:

Parameter C++ type Description
type cir::BoolType  
value bool  

TBAAAttr

Syntax: #cir.tbaa

CmpThreeWayInfoAttr

Holds information about a three-way comparison operation

Syntax:

#cir.cmp3way_info<
  CmpOrdering,   # ordering
  int64_t,   # lt
  int64_t,   # eq
  int64_t,   # gt
  std::optional<int64_t>   # unordered
>

The #cmp3way_info attribute contains information about a three-way comparison operation cir.cmp3way.

The ordering parameter gives the ordering kind of the three-way comparison operation. It may be either strong ordering or partial ordering.

Given the two input operands of the three-way comparison operation lhs and rhs, the lt, eq, gt, and unordered parameters gives the result value that should be produced by the three-way comparison operation when the ordering between lhs and rhs is lhs < rhs, lhs == rhs, lhs > rhs, or neither, respectively.

Parameters:

Parameter C++ type Description
ordering CmpOrdering  
lt int64_t  
eq int64_t  
gt int64_t  
unordered std::optional<int64_t>  

ComplexAttr

An attribute that contains a constant complex value

Syntax:

#cir.complex<
  cir::ComplexType,   # type
  mlir::TypedAttr,   # real
  mlir::TypedAttr   # imag
>

The #cir.complex attribute contains a constant value of complex number type. The real parameter gives the real part of the complex number and the imag parameter gives the imaginary part of the complex number.

The real and imag parameter must be either an IntAttr or an FPAttr that contains values of the same CIR type.

Parameters:

Parameter C++ type Description
type cir::ComplexType  
real mlir::TypedAttr  
imag mlir::TypedAttr  

ConstArrayAttr

A constant array from ArrayAttr or StringRefAttr

An CIR array attribute is an array of literals of the specified attr types.

Parameters:

Parameter C++ type Description
type ::mlir::Type  
elts mlir::Attribute  
trailingZerosNum int  

ConstPtrAttr

Holds a constant pointer value

Syntax:

#cir.ptr<
  ::cir::PointerType,   # type
  mlir::IntegerAttr   # value
>

A pointer attribute is a literal attribute that represents an integral value of a pointer type.

Parameters:

Parameter C++ type Description
type ::cir::PointerType  
value mlir::IntegerAttr  

ConstStructAttr

Represents a constant struct

Syntax:

#cir.const_struct<
  ::mlir::Type,   # type
  mlir::ArrayAttr   # members
>

Effectively supports "struct-like" constants. It's must be built from an mlir::ArrayAttr instance where each elements is a typed attribute (mlir::TypedAttribute).

Example:

cir.global external @rgb2 = #cir.const_struct<{0 : i8,
                                               5 : i64, #cir.null : !cir.ptr<i8>
                                              }> : !cir.struct<"", i8, i64, !cir.ptr<i8>>

Parameters:

Parameter C++ type Description
type ::mlir::Type  
members mlir::ArrayAttr  

ConstVectorAttr

A constant vector from ArrayAttr

A CIR vector attribute is an array of literals of the specified attribute types.

Parameters:

Parameter C++ type Description
type ::mlir::Type  
elts mlir::ArrayAttr  

ConvergentAttr

Syntax: #cir.convergent

DataMemberAttr

Holds a constant data member pointer value

Syntax:

#cir.data_member<
  cir::DataMemberType,   # type
  std::optional<unsigned>   # member_index
>

A data member attribute is a literal attribute that represents a constant pointer-to-data-member value.

The member_index parameter represents the index of the pointed-to member within its containing struct. It is an optional parameter; lack of this parameter indicates a null pointer-to-data-member value.

Example:

#ptr = #cir.data_member<1> : !cir.data_member<!s32i in !ty_22Point22>

#null = #cir.data_member<null> : !cir.data_member<!s32i in !ty_22Point22>

Parameters:

Parameter C++ type Description
type cir::DataMemberType  
member_index std::optional<unsigned>  

DynamicCastInfoAttr

ABI specific information about a dynamic cast

Syntax:

#cir.dyn_cast_info<
  ::cir::GlobalViewAttr,   # srcRtti
  ::cir::GlobalViewAttr,   # destRtti
  mlir::FlatSymbolRefAttr,   # runtimeFunc
  mlir::FlatSymbolRefAttr,   # badCastFunc
  ::cir::IntAttr   # offsetHint
>

Provide ABI specific information about a dynamic cast operation.

The srcRtti and the destRtti parameters give the RTTI of the source struct type and the destination struct type, respectively.

The runtimeFunc parameter gives the __dynamic_cast function which is provided by the runtime. The badCastFunc parameter gives the __cxa_bad_cast function which is also provided by the runtime.

The offsetHint parameter gives the hint value that should be passed to the __dynamic_cast runtime function.

Parameters:

Parameter C++ type Description
srcRtti ::cir::GlobalViewAttr Provides constant access to a global address
destRtti ::cir::GlobalViewAttr Provides constant access to a global address
runtimeFunc mlir::FlatSymbolRefAttr  
badCastFunc mlir::FlatSymbolRefAttr  
offsetHint ::cir::IntAttr An Attribute containing a integer value

ExtraFuncAttributesAttr

Represents aggregated attributes for a function

Syntax:

#cir.extra<
  mlir::DictionaryAttr   # elements
>

This is a wrapper of attribute dictionary that contains extra attributes of a function.

Parameters:

Parameter C++ type Description
elements mlir::DictionaryAttr  

FPAttr

An attribute containing a floating-point value

Syntax:

#cir.fp<
  ::cir::CIRFPTypeInterface,   # type
  ::llvm::APFloat   # value
>

An fp attribute is a literal attribute that represents a floating-point value of the specified floating-point type. Supporting only CIR FP types.

Parameters:

Parameter C++ type Description
type ::cir::CIRFPTypeInterface  
value ::llvm::APFloat  

GlobalAnnotationValuesAttr

Array of annotations, each element consists of name ofa global var or func and one of its annotations

Syntax:

#cir.global_annotations<
  mlir::ArrayAttr   # annotations
>

This is annotation value array, which holds the annotation values for all global variables and functions in a module. This array is used to create the initial value of a global annotation metadata variable in LLVM IR. Example C code:

double *a __attribute__((annotate("withargs", "21", 12 )));
int *b __attribute__((annotate("withargs", "21", 12 )));
void *c __attribute__((annotate("noargvar")));
void foo(int i) __attribute__((annotate("noargfunc"))) {}

After CIR lowering prepare pass, compiler generates a GlobalAnnotationValuesAttr like the following:

#cir<global_annotations [
  ["a", #cir.annotation<name = "withargs", args = ["21", 12 : i32]>],
  ["b", #cir.annotation<name = "withargs", args = ["21", 12 : i32]>],
  ["c", #cir.annotation<name = "noargvar", args = []>],
  ["foo", #cir.annotation<name = "noargfunc", args = []>]]>

Parameters:

Parameter C++ type Description
annotations mlir::ArrayAttr  

GlobalCtorAttr

Marks a function as a global constructor

Syntax:

#cir.global_ctor<
  mlir::StringAttr,   # name
  int   # priority
>

A function with this attribute executes before main()

Parameters:

Parameter C++ type Description
name mlir::StringAttr  
priority int  

GlobalDtorAttr

Marks a function as a global destructor

Syntax:

#cir.global_dtor<
  mlir::StringAttr,   # name
  int   # priority
>

A function with this attribute excutes before module unloading

Parameters:

Parameter C++ type Description
name mlir::StringAttr  
priority int  

GlobalViewAttr

Provides constant access to a global address

Syntax:

#cir.global_view<
  ::mlir::Type,   # type
  mlir::FlatSymbolRefAttr,   # symbol
  mlir::ArrayAttr   # indices
>

Get constant address of global symbol and optionally apply offsets to access existing subelements. It provides a way to access globals from other global and always produces a pointer.

The type of the input symbol can be different from #cir.global_view output type, since a given view of the global might require a static cast for initializing other globals.

A list of indices can be optionally passed and each element subsequently indexes underlying types. For symbol types like !cir.array and !cir.struct, it leads to the constant address of sub-elements, while for !cir.ptr, an offset is applied. The first index is relative to the original symbol type, not the produced one.

Example:

  cir.global external @s = @".str2": !cir.ptr<i8>
  cir.global external @x = #cir.global_view<@s> : !cir.ptr<i8>

  cir.global external @rgb = #cir.const_array<[0 : i8, -23 : i8, 33 : i8] : !cir.array<i8 x 3>>
  cir.global external @elt_ptr = #cir.global_view<@rgb, [1]> : !cir.ptr<i8>
  cir.global external @table_of_ptrs = #cir.const_array<[#cir.global_view<@rgb, [1]> : !cir.ptr<i8>] : !cir.array<!cir.ptr<i8> x 1>>

Parameters:

Parameter C++ type Description
type ::mlir::Type  
symbol mlir::FlatSymbolRefAttr  
indices mlir::ArrayAttr  

InactiveUnionFieldAttr

Attribute to represent an uninitialized field for a union.

Syntax:

#cir.inactive_field<
  ::mlir::Type   # type
>

The InactiveUnionFieldAttr is used to represent an uninitialized field for a union.

Parameters:

Parameter C++ type Description
type ::mlir::Type  

InlineAttr

Inline attribute

Syntax:

#cir.inline<
  InlineKind   # value
>

Inline attributes represents user directives.

Parameters:

Parameter C++ type Description
value InlineKind  

IntAttr

An Attribute containing a integer value

An integer attribute is a literal attribute that represents an integral value of the specified integer type.

Parameters:

Parameter C++ type Description
type ::mlir::Type  
value llvm::APInt  

LangAttr

Module source language

Represents the source language used to generate the module.

Example:

// Module compiled from C.
module attributes {cir.lang = cir.lang<c>} {}
// Module compiled from C++.
module attributes {cir.lang = cir.lang<cxx>} {}

Parameters:

Parameter C++ type Description
lang SourceLanguageAttr  

MethodAttr

Holds a constant pointer-to-member-function value

A method attribute is a literal attribute that represents a constant pointer-to-member-function value.

If the member function is a non-virtual function, the symbol parameter gives the global symbol for the non-virtual member function.

If the member function is a virtual function, the vtable_offset parameter gives the offset of the vtable entry corresponding to the virtual member function.

symbol and vtable_offset cannot be present at the same time. If both of symbol and vtable_offset are not present, the attribute represents a null pointer constant.

Parameters:

Parameter C++ type Description
type cir::MethodType  
symbol std::optional<mlir::FlatSymbolRefAttr>  
vtable_offset std::optional<uint64_t>  

NoThrowAttr

Syntax: #cir.nothrow

OpenCLKernelArgMetadataAttr

OpenCL kernel argument metadata

Syntax:

#cir.cl.kernel_arg_metadata<
  mlir::ArrayAttr,   # addr_space
  mlir::ArrayAttr,   # access_qual
  mlir::ArrayAttr,   # type
  mlir::ArrayAttr,   # base_type
  mlir::ArrayAttr,   # type_qual
  mlir::ArrayAttr   # name
>

Provide the required information of an OpenCL kernel argument for the SPIR-V backend.

All parameters are arrays, containing the information of the argument in the same order as they appear in the source code.

The addr_space parameter is an array of I32 that provides the address space of the argument. It's useful for special types like image, which have implicit global address space.

Other parameters are arrays of strings that pass through the information from the source code correspondingly.

All the fields are mandatory except for name, which is optional.

Example:

#fn_attr = #cir<extra({cl.kernel_arg_metadata = #cir.cl.kernel_arg_metadata<
  addr_space = [1 : i32],
  access_qual = ["none"],
  type = ["char*"],
  base_type = ["char*"],
  type_qual = [""],
  name = ["in"]
>})>

cir.func @kernel(%arg0: !s32i) extra(#fn_attr) {
  cir.return
}

Parameters:

Parameter C++ type Description
addr_space mlir::ArrayAttr  
access_qual mlir::ArrayAttr  
type mlir::ArrayAttr  
base_type mlir::ArrayAttr  
type_qual mlir::ArrayAttr  
name mlir::ArrayAttr  

OpenCLKernelAttr

OpenCL kernel

Syntax: #cir.cl.kernel

Indicate the function is a OpenCL kernel.

OpenCLKernelMetadataAttr

OpenCL kernel metadata

Syntax:

#cir.cl.kernel_metadata<
  mlir::ArrayAttr,   # work_group_size_hint
  mlir::ArrayAttr,   # reqd_work_group_size
  mlir::TypeAttr,   # vec_type_hint
  std::optional<bool>,   # vec_type_hint_signedness
  mlir::IntegerAttr   # intel_reqd_sub_group_size
>

Provide the required information of an OpenCL kernel for the SPIR-V backend.

The work_group_size_hint and reqd_work_group_size parameter are integer arrays with 3 elements that provide hints for the work-group size and the required work-group size, respectively.

The vec_type_hint parameter is a type attribute that provides a hint for the vectorization. It can be a CIR or LLVM type, depending on the lowering stage.

The vec_type_hint_signedness parameter is a boolean that indicates the signedness of the vector type hint. It's useful when LLVM type is set in vec_type_hint, which is signless by design. It should be set if and only if the vec_type_hint is present.

The intel_reqd_sub_group_size parameter is an integer that restricts the sub-group size to the specified value.

Example:

#fn_attr = #cir<extra({cl.kernel_metadata = #cir.cl.kernel_metadata<
  work_group_size_hint = [8 : i32, 16 : i32, 32 : i32],
  reqd_work_group_size = [1 : i32, 2 : i32, 4 : i32],
  vec_type_hint = !s32i,
  vec_type_hint_signedness = 1,
  intel_reqd_sub_group_size = 8 : i32
>})>

cir.func @kernel(%arg0: !s32i) extra(#fn_attr) {
  cir.return
}

Parameters:

Parameter C++ type Description
work_group_size_hint mlir::ArrayAttr  
reqd_work_group_size mlir::ArrayAttr  
vec_type_hint mlir::TypeAttr  
vec_type_hint_signedness std::optional<bool>  
intel_reqd_sub_group_size mlir::IntegerAttr  

OpenCLKernelUniformWorkGroupSizeAttr

OpenCL kernel work-group uniformity

Syntax: #cir.cl.uniform_work_group_size

In OpenCL v2.0, work groups can either be uniform or non-uniform. This attribute is associated with kernels to represent the work group type. Non-kernel entities should not interact with this attribute.

Clang's -cl-uniform-work-group-size compilation option provides a hint to the compiler, indicating that the global work size should be a multiple of the work-group size specified in the clEnqueueNDRangeKernel function, thereby ensuring that the work groups are uniform.

OpenCLVersionAttr

OpenCL version

Syntax:

#cir.cl.version<
  int32_t,   # major_version
  int32_t   # minor_version
>

Represents the version of OpenCL.

Example:

// Module compiled from OpenCL 1.2.
module attributes {cir.cl.version = cir.cl.version<1, 2>} {}
// Module compiled from OpenCL 3.0.
module attributes {cir.cl.version = cir.cl.version<3, 0>} {}

Parameters:

Parameter C++ type Description
major_version int32_t  
minor_version int32_t  

OptNoneAttr

Syntax: #cir.optnone

SignedOverflowBehaviorAttr

Parameters:

Parameter C++ type Description
behavior sob::SignedOverflowBehavior  

StructLayoutAttr

ABI specific information about a struct layout

Syntax:

#cir.struct_layout<
  unsigned,   # size
  unsigned,   # alignment
  bool,   # padded
  mlir::Type,   # largest_member
  mlir::ArrayAttr   # offsets
>

Holds layout information often queried by !cir.struct users during lowering passes and optimizations.

Parameters:

Parameter C++ type Description
size unsigned  
alignment unsigned  
padded bool  
largest_member mlir::Type  
offsets mlir::ArrayAttr  

TypeInfoAttr

Represents a typeinfo used for RTTI

Syntax:

#cir.typeinfo<
  ::mlir::Type,   # type
  mlir::ArrayAttr   # data
>

The typeinfo data for a given class is stored into an ArrayAttr. The layout is determined by the C++ ABI used (clang only implements itanium on CIRGen).

The verifier enforces that the output type is always a !cir.struct, and that the ArrayAttr element types match the equivalent member type for the resulting struct, i.e, a GlobalViewAttr for symbol reference or an IntAttr for flags.

Example:

cir.global "private" external @_ZTVN10__cxxabiv120__si_class_type_infoE : !cir.ptr<i32>

cir.global external @type_info_B = #cir.typeinfo<<
  {#cir.global_view<@_ZTVN10__cxxabiv120__si_class_type_infoE, [2]> : !cir.ptr<i8>}
>> : !cir.struct<"", !cir.ptr<i8>>

Parameters:

Parameter C++ type Description
type ::mlir::Type  
data mlir::ArrayAttr  

UndefAttr

Represent an undef constant

Syntax:

#cir.undef<
  ::mlir::Type   # type
>

The UndefAttr represents an undef constant, corresponding to LLVM's notion of undef.

Parameters:

Parameter C++ type Description
type ::mlir::Type  

VTableAttr

Represents a C++ vtable

Syntax:

#cir.vtable<
  ::mlir::Type,   # type
  mlir::ArrayAttr   # vtable_data
>

Wraps a #cir.const_struct containing vtable data.

Example:

cir.global linkonce_odr @_ZTV1B = #cir.vtable<<
    {#cir.const_array<[#cir.null : !cir.ptr<i8>,
     #cir.global_view<@_ZTI1B> : !cir.ptr<i8>,
     #cir.global_view<@_ZN1BD1Ev> : !cir.ptr<i8>,
     #cir.global_view<@_ZN1BD0Ev> : !cir.ptr<i8>,
     #cir.global_view<@_ZNK1A5quackEv> : !cir.ptr<i8>]>
     : !cir.array<!cir.ptr<i8> x 5>}>>
  : !cir.struct<"", !cir.array<!cir.ptr<i8> x 5>>

Parameters:

Parameter C++ type Description
type ::mlir::Type  
vtable_data mlir::ArrayAttr  

VisibilityAttr

Visibility attribute

Syntax:

#cir.visibility<
  VisibilityKind   # value
>

Visibility attributes.

Parameters:

Parameter C++ type Description
value VisibilityKind  

ZeroAttr

Attribute to represent zero initialization

Syntax:

#cir.zero<
  ::mlir::Type   # type
>

The ZeroAttr is used to indicate zero initialization on structs.

Parameters:

Parameter C++ type Description
type ::mlir::Type