xref: /llvm-project/mlir/include/mlir/Dialect/Ptr/IR/PtrAttrDefs.td (revision e035ef0e7423c1a4c78e922508da817dbd5b6a02)
1//===-- PtrAttrDefs.td - Ptr Attributes definition file ----*- tablegen -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef PTR_ATTRDEFS
10#define PTR_ATTRDEFS
11
12include "mlir/Dialect/Ptr/IR/PtrDialect.td"
13include "mlir/IR/AttrTypeBase.td"
14
15// All of the attributes will extend this class.
16class Ptr_Attr<string name, string attrMnemonic,
17                list<Trait> traits = [],
18                string baseCppClass = "::mlir::Attribute">
19    : AttrDef<Ptr_Dialect, name, traits, baseCppClass> {
20  let mnemonic = attrMnemonic;
21}
22
23//===----------------------------------------------------------------------===//
24// SpecAttr
25//===----------------------------------------------------------------------===//
26
27def Ptr_SpecAttr : Ptr_Attr<"Spec", "spec"> {
28  let summary = "ptr data layout spec";
29  let description = [{
30    Defines the data layout spec for a pointer type. This attribute has 4
31    fields:
32     - [Required] size: size of the pointer in bits.
33     - [Required] abi: ABI-required alignment for the pointer in bits.
34     - [Required] preferred: preferred alignment for the pointer in bits.
35     - [Optional] index: bitwidth that should be used when performing index
36     computations for the type. Setting the field to `kOptionalSpecValue`, means
37     the field is optional.
38
39    Furthermore, the attribute will verify that all present values are divisible
40    by 8 (number of bits in a byte), and that `preferred` > `abi`.
41
42    Example:
43    ```mlir
44    // Spec for a 64 bit ptr, with a required alignment of 64 bits, but with
45    // a preferred alignment of 128 bits and an index bitwidth of 64 bits.
46    #ptr.spec<size = 64, abi = 64, preferred = 128, index = 64>
47    ```
48  }];
49  let parameters = (ins
50    "uint32_t":$size,
51    "uint32_t":$abi,
52    "uint32_t":$preferred,
53    DefaultValuedParameter<"uint32_t", "kOptionalSpecValue">:$index
54  );
55  let skipDefaultBuilders = 1;
56  let builders = [
57    AttrBuilder<(ins "uint32_t":$size, "uint32_t":$abi, "uint32_t":$preferred,
58                     CArg<"uint32_t", "kOptionalSpecValue">:$index), [{
59      return $_get($_ctxt, size, abi, preferred, index);
60    }]>
61  ];
62  let assemblyFormat = "`<` struct(params) `>`";
63  let extraClassDeclaration = [{
64    /// Constant for specifying a spec entry is optional.
65    static constexpr uint32_t kOptionalSpecValue = std::numeric_limits<uint32_t>::max();
66  }];
67  let genVerifyDecl = 1;
68}
69
70#endif // PTR_ATTRDEFS
71