190 lines · cpp
1//===- EmitC.cpp - C Interface for EmitC dialect --------------------------===//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-exception6//7//===----------------------------------------------------------------------===//8 9#include "mlir-c/Dialect/EmitC.h"10#include "mlir/CAPI/Registration.h"11#include "mlir/Dialect/EmitC/IR/EmitC.h"12 13using namespace mlir;14 15MLIR_DEFINE_CAPI_DIALECT_REGISTRATION(EmitC, emitc, mlir::emitc::EmitCDialect)16 17// Ensure the C-API enums are uint64_t-castable to C++ equivalents.18static_assert(static_cast<uint64_t>(MLIR_EMITC_CMP_PREDICATE_EQ) ==19 static_cast<uint64_t>(emitc::CmpPredicate::eq) &&20 static_cast<uint64_t>(MLIR_EMITC_CMP_PREDICATE_NE) ==21 static_cast<uint64_t>(emitc::CmpPredicate::ne) &&22 static_cast<uint64_t>(MLIR_EMITC_CMP_PREDICATE_LT) ==23 static_cast<uint64_t>(emitc::CmpPredicate::lt) &&24 static_cast<uint64_t>(MLIR_EMITC_CMP_PREDICATE_LE) ==25 static_cast<uint64_t>(emitc::CmpPredicate::le) &&26 static_cast<uint64_t>(MLIR_EMITC_CMP_PREDICATE_GT) ==27 static_cast<uint64_t>(emitc::CmpPredicate::gt) &&28 static_cast<uint64_t>(MLIR_EMITC_CMP_PREDICATE_GE) ==29 static_cast<uint64_t>(emitc::CmpPredicate::ge) &&30 static_cast<uint64_t>(MLIR_EMITC_CMP_PREDICATE_THREE_WAY) ==31 static_cast<uint64_t>(emitc::CmpPredicate::three_way),32 "MlirEmitCCmpPredicate (C-API) and CmpPredicate (C++) mismatch");33 34//===---------------------------------------------------------------------===//35// ArrayType36//===---------------------------------------------------------------------===//37 38bool mlirTypeIsAEmitCArrayType(MlirType type) {39 return isa<emitc::ArrayType>(unwrap(type));40}41 42MlirTypeID mlirEmitCArrayTypeGetTypeID(void) {43 return wrap(emitc::ArrayType::getTypeID());44}45 46MlirType mlirEmitCArrayTypeGet(intptr_t nDims, int64_t *shape,47 MlirType elementType) {48 return wrap(49 emitc::ArrayType::get(llvm::ArrayRef(shape, nDims), unwrap(elementType)));50}51 52//===---------------------------------------------------------------------===//53// LValueType54//===---------------------------------------------------------------------===//55 56bool mlirTypeIsAEmitCLValueType(MlirType type) {57 return isa<emitc::LValueType>(unwrap(type));58}59 60MlirTypeID mlirEmitCLValueTypeGetTypeID(void) {61 return wrap(emitc::LValueType::getTypeID());62}63 64MlirType mlirEmitCLValueTypeGet(MlirType valueType) {65 return wrap(emitc::LValueType::get(unwrap(valueType)));66}67 68//===---------------------------------------------------------------------===//69// OpaqueType70//===---------------------------------------------------------------------===//71 72bool mlirTypeIsAEmitCOpaqueType(MlirType type) {73 return isa<emitc::OpaqueType>(unwrap(type));74}75 76MlirTypeID mlirEmitCOpaqueTypeGetTypeID(void) {77 return wrap(emitc::OpaqueType::getTypeID());78}79 80MlirType mlirEmitCOpaqueTypeGet(MlirContext ctx, MlirStringRef value) {81 return wrap(emitc::OpaqueType::get(unwrap(ctx), unwrap(value)));82}83 84//===---------------------------------------------------------------------===//85// PointerType86//===---------------------------------------------------------------------===//87 88bool mlirTypeIsAEmitCPointerType(MlirType type) {89 return isa<emitc::PointerType>(unwrap(type));90}91 92MlirTypeID mlirEmitCPointerTypeGetTypeID(void) {93 return wrap(emitc::PointerType::getTypeID());94}95 96MlirType mlirEmitCPointerTypeGet(MlirType pointee) {97 return wrap(emitc::PointerType::get(unwrap(pointee)));98}99 100//===---------------------------------------------------------------------===//101// PtrDiffTType102//===---------------------------------------------------------------------===//103 104bool mlirTypeIsAEmitCPtrDiffTType(MlirType type) {105 return isa<emitc::PtrDiffTType>(unwrap(type));106}107 108MlirTypeID mlirEmitCPtrDiffTTypeGetTypeID(void) {109 return wrap(emitc::PtrDiffTType::getTypeID());110}111 112MlirType mlirEmitCPtrDiffTTypeGet(MlirContext ctx) {113 return wrap(emitc::PtrDiffTType::get(unwrap(ctx)));114}115 116//===---------------------------------------------------------------------===//117// SignedSizeTType118//===---------------------------------------------------------------------===//119 120bool mlirTypeIsAEmitCSignedSizeTType(MlirType type) {121 return isa<emitc::SignedSizeTType>(unwrap(type));122}123 124MlirTypeID mlirEmitCSignedSizeTTypeGetTypeID(void) {125 return wrap(emitc::SignedSizeTType::getTypeID());126}127 128MlirType mlirEmitCSignedSizeTTypeGet(MlirContext ctx) {129 return wrap(emitc::SignedSizeTType::get(unwrap(ctx)));130}131 132//===---------------------------------------------------------------------===//133// SizeTType134//===---------------------------------------------------------------------===//135 136bool mlirTypeIsAEmitCSizeTType(MlirType type) {137 return isa<emitc::SizeTType>(unwrap(type));138}139 140MlirTypeID mlirEmitCSizeTTypeGetTypeID(void) {141 return wrap(emitc::SizeTType::getTypeID());142}143 144MlirType mlirEmitCSizeTTypeGet(MlirContext ctx) {145 return wrap(emitc::SizeTType::get(unwrap(ctx)));146}147 148//===----------------------------------------------------------------------===//149// CmpPredicate attribute.150//===----------------------------------------------------------------------===//151 152bool mlirAttributeIsAEmitCCmpPredicate(MlirAttribute attr) {153 return llvm::isa<emitc::CmpPredicateAttr>(unwrap(attr));154}155 156MlirAttribute mlirEmitCCmpPredicateAttrGet(MlirContext ctx,157 MlirEmitCCmpPredicate val) {158 return wrap((Attribute)emitc::CmpPredicateAttr::get(159 unwrap(ctx), static_cast<emitc::CmpPredicate>(val)));160}161 162MlirEmitCCmpPredicate mlirEmitCCmpPredicateAttrGetValue(MlirAttribute attr) {163 return static_cast<MlirEmitCCmpPredicate>(164 llvm::cast<emitc::CmpPredicateAttr>(unwrap(attr)).getValue());165}166 167MlirTypeID mlirEmitCCmpPredicateAttrGetTypeID(void) {168 return wrap(emitc::CmpPredicateAttr::getTypeID());169}170 171//===----------------------------------------------------------------------===//172// Opaque attribute.173//===----------------------------------------------------------------------===//174 175bool mlirAttributeIsAEmitCOpaque(MlirAttribute attr) {176 return llvm::isa<emitc::OpaqueAttr>(unwrap(attr));177}178 179MlirAttribute mlirEmitCOpaqueAttrGet(MlirContext ctx, MlirStringRef value) {180 return wrap((Attribute)emitc::OpaqueAttr::get(unwrap(ctx), unwrap(value)));181}182 183MlirStringRef mlirEmitCOpaqueAttrGetValue(MlirAttribute attr) {184 return wrap(llvm::cast<emitc::OpaqueAttr>(unwrap(attr)).getValue());185}186 187MlirTypeID mlirEmitCOpaqueAttrGetTypeID(void) {188 return wrap(emitc::OpaqueAttr::getTypeID());189}190