xref: /llvm-project/mlir/lib/Dialect/Ptr/IR/PtrAttrs.cpp (revision e035ef0e7423c1a4c78e922508da817dbd5b6a02)
1*e035ef0eSFabian Mora //===- PtrAttrs.cpp - Pointer dialect attributes ----------------*- C++ -*-===//
2*e035ef0eSFabian Mora //
3*e035ef0eSFabian Mora // This file is licensed under the Apache License v2.0 with LLVM Exceptions.
4*e035ef0eSFabian Mora // See https://llvm.org/LICENSE.txt for license information.
5*e035ef0eSFabian Mora // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*e035ef0eSFabian Mora //
7*e035ef0eSFabian Mora //===----------------------------------------------------------------------===//
8*e035ef0eSFabian Mora //
9*e035ef0eSFabian Mora // This file defines the Ptr dialect attributes.
10*e035ef0eSFabian Mora //
11*e035ef0eSFabian Mora //===----------------------------------------------------------------------===//
12*e035ef0eSFabian Mora 
13*e035ef0eSFabian Mora #include "mlir/Dialect/Ptr/IR/PtrAttrs.h"
14*e035ef0eSFabian Mora #include "llvm/ADT/TypeSwitch.h"
15*e035ef0eSFabian Mora 
16*e035ef0eSFabian Mora using namespace mlir;
17*e035ef0eSFabian Mora using namespace mlir::ptr;
18*e035ef0eSFabian Mora 
19*e035ef0eSFabian Mora constexpr const static unsigned kBitsInByte = 8;
20*e035ef0eSFabian Mora 
21*e035ef0eSFabian Mora //===----------------------------------------------------------------------===//
22*e035ef0eSFabian Mora // SpecAttr
23*e035ef0eSFabian Mora //===----------------------------------------------------------------------===//
24*e035ef0eSFabian Mora 
verify(function_ref<InFlightDiagnostic ()> emitError,uint32_t size,uint32_t abi,uint32_t preferred,uint32_t index)25*e035ef0eSFabian Mora LogicalResult SpecAttr::verify(function_ref<InFlightDiagnostic()> emitError,
26*e035ef0eSFabian Mora                                uint32_t size, uint32_t abi, uint32_t preferred,
27*e035ef0eSFabian Mora                                uint32_t index) {
28*e035ef0eSFabian Mora   if (size % kBitsInByte != 0)
29*e035ef0eSFabian Mora     return emitError() << "size entry must be divisible by 8";
30*e035ef0eSFabian Mora   if (abi % kBitsInByte != 0)
31*e035ef0eSFabian Mora     return emitError() << "abi entry must be divisible by 8";
32*e035ef0eSFabian Mora   if (preferred % kBitsInByte != 0)
33*e035ef0eSFabian Mora     return emitError() << "preferred entry must be divisible by 8";
34*e035ef0eSFabian Mora   if (index != kOptionalSpecValue && index % kBitsInByte != 0)
35*e035ef0eSFabian Mora     return emitError() << "index entry must be divisible by 8";
36*e035ef0eSFabian Mora   if (abi > preferred)
37*e035ef0eSFabian Mora     return emitError() << "preferred alignment is expected to be at least "
38*e035ef0eSFabian Mora                           "as large as ABI alignment";
39*e035ef0eSFabian Mora   return success();
40*e035ef0eSFabian Mora }
41