1 //===- BuiltinAttributes.cpp - C Interface to MLIR Builtin Attributes -----===// 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 #include "mlir-c/BuiltinAttributes.h" 10 #include "mlir/CAPI/AffineMap.h" 11 #include "mlir/CAPI/IR.h" 12 #include "mlir/CAPI/Support.h" 13 #include "mlir/IR/Attributes.h" 14 #include "mlir/IR/BuiltinTypes.h" 15 16 using namespace mlir; 17 18 MlirAttribute mlirAttributeGetNull() { return {nullptr}; } 19 20 //===----------------------------------------------------------------------===// 21 // Affine map attribute. 22 //===----------------------------------------------------------------------===// 23 24 bool mlirAttributeIsAAffineMap(MlirAttribute attr) { 25 return unwrap(attr).isa<AffineMapAttr>(); 26 } 27 28 MlirAttribute mlirAffineMapAttrGet(MlirAffineMap map) { 29 return wrap(AffineMapAttr::get(unwrap(map))); 30 } 31 32 MlirAffineMap mlirAffineMapAttrGetValue(MlirAttribute attr) { 33 return wrap(unwrap(attr).cast<AffineMapAttr>().getValue()); 34 } 35 36 //===----------------------------------------------------------------------===// 37 // Array attribute. 38 //===----------------------------------------------------------------------===// 39 40 bool mlirAttributeIsAArray(MlirAttribute attr) { 41 return unwrap(attr).isa<ArrayAttr>(); 42 } 43 44 MlirAttribute mlirArrayAttrGet(MlirContext ctx, intptr_t numElements, 45 MlirAttribute const *elements) { 46 SmallVector<Attribute, 8> attrs; 47 return wrap( 48 ArrayAttr::get(unwrap(ctx), unwrapList(static_cast<size_t>(numElements), 49 elements, attrs))); 50 } 51 52 intptr_t mlirArrayAttrGetNumElements(MlirAttribute attr) { 53 return static_cast<intptr_t>(unwrap(attr).cast<ArrayAttr>().size()); 54 } 55 56 MlirAttribute mlirArrayAttrGetElement(MlirAttribute attr, intptr_t pos) { 57 return wrap(unwrap(attr).cast<ArrayAttr>().getValue()[pos]); 58 } 59 60 //===----------------------------------------------------------------------===// 61 // Dictionary attribute. 62 //===----------------------------------------------------------------------===// 63 64 bool mlirAttributeIsADictionary(MlirAttribute attr) { 65 return unwrap(attr).isa<DictionaryAttr>(); 66 } 67 68 MlirAttribute mlirDictionaryAttrGet(MlirContext ctx, intptr_t numElements, 69 MlirNamedAttribute const *elements) { 70 SmallVector<NamedAttribute, 8> attributes; 71 attributes.reserve(numElements); 72 for (intptr_t i = 0; i < numElements; ++i) 73 attributes.emplace_back(unwrap(elements[i].name), 74 unwrap(elements[i].attribute)); 75 return wrap(DictionaryAttr::get(unwrap(ctx), attributes)); 76 } 77 78 intptr_t mlirDictionaryAttrGetNumElements(MlirAttribute attr) { 79 return static_cast<intptr_t>(unwrap(attr).cast<DictionaryAttr>().size()); 80 } 81 82 MlirNamedAttribute mlirDictionaryAttrGetElement(MlirAttribute attr, 83 intptr_t pos) { 84 NamedAttribute attribute = 85 unwrap(attr).cast<DictionaryAttr>().getValue()[pos]; 86 return {wrap(attribute.first), wrap(attribute.second)}; 87 } 88 89 MlirAttribute mlirDictionaryAttrGetElementByName(MlirAttribute attr, 90 MlirStringRef name) { 91 return wrap(unwrap(attr).cast<DictionaryAttr>().get(unwrap(name))); 92 } 93 94 //===----------------------------------------------------------------------===// 95 // Floating point attribute. 96 //===----------------------------------------------------------------------===// 97 98 bool mlirAttributeIsAFloat(MlirAttribute attr) { 99 return unwrap(attr).isa<FloatAttr>(); 100 } 101 102 MlirAttribute mlirFloatAttrDoubleGet(MlirContext ctx, MlirType type, 103 double value) { 104 return wrap(FloatAttr::get(unwrap(type), value)); 105 } 106 107 MlirAttribute mlirFloatAttrDoubleGetChecked(MlirLocation loc, MlirType type, 108 double value) { 109 return wrap(FloatAttr::getChecked(unwrap(loc), unwrap(type), value)); 110 } 111 112 double mlirFloatAttrGetValueDouble(MlirAttribute attr) { 113 return unwrap(attr).cast<FloatAttr>().getValueAsDouble(); 114 } 115 116 //===----------------------------------------------------------------------===// 117 // Integer attribute. 118 //===----------------------------------------------------------------------===// 119 120 bool mlirAttributeIsAInteger(MlirAttribute attr) { 121 return unwrap(attr).isa<IntegerAttr>(); 122 } 123 124 MlirAttribute mlirIntegerAttrGet(MlirType type, int64_t value) { 125 return wrap(IntegerAttr::get(unwrap(type), value)); 126 } 127 128 int64_t mlirIntegerAttrGetValueInt(MlirAttribute attr) { 129 return unwrap(attr).cast<IntegerAttr>().getInt(); 130 } 131 132 //===----------------------------------------------------------------------===// 133 // Bool attribute. 134 //===----------------------------------------------------------------------===// 135 136 bool mlirAttributeIsABool(MlirAttribute attr) { 137 return unwrap(attr).isa<BoolAttr>(); 138 } 139 140 MlirAttribute mlirBoolAttrGet(MlirContext ctx, int value) { 141 return wrap(BoolAttr::get(unwrap(ctx), value)); 142 } 143 144 bool mlirBoolAttrGetValue(MlirAttribute attr) { 145 return unwrap(attr).cast<BoolAttr>().getValue(); 146 } 147 148 //===----------------------------------------------------------------------===// 149 // Integer set attribute. 150 //===----------------------------------------------------------------------===// 151 152 bool mlirAttributeIsAIntegerSet(MlirAttribute attr) { 153 return unwrap(attr).isa<IntegerSetAttr>(); 154 } 155 156 //===----------------------------------------------------------------------===// 157 // Opaque attribute. 158 //===----------------------------------------------------------------------===// 159 160 bool mlirAttributeIsAOpaque(MlirAttribute attr) { 161 return unwrap(attr).isa<OpaqueAttr>(); 162 } 163 164 MlirAttribute mlirOpaqueAttrGet(MlirContext ctx, MlirStringRef dialectNamespace, 165 intptr_t dataLength, const char *data, 166 MlirType type) { 167 return wrap( 168 OpaqueAttr::get(Identifier::get(unwrap(dialectNamespace), unwrap(ctx)), 169 StringRef(data, dataLength), unwrap(type))); 170 } 171 172 MlirStringRef mlirOpaqueAttrGetDialectNamespace(MlirAttribute attr) { 173 return wrap(unwrap(attr).cast<OpaqueAttr>().getDialectNamespace().strref()); 174 } 175 176 MlirStringRef mlirOpaqueAttrGetData(MlirAttribute attr) { 177 return wrap(unwrap(attr).cast<OpaqueAttr>().getAttrData()); 178 } 179 180 //===----------------------------------------------------------------------===// 181 // String attribute. 182 //===----------------------------------------------------------------------===// 183 184 bool mlirAttributeIsAString(MlirAttribute attr) { 185 return unwrap(attr).isa<StringAttr>(); 186 } 187 188 MlirAttribute mlirStringAttrGet(MlirContext ctx, MlirStringRef str) { 189 return wrap(StringAttr::get(unwrap(ctx), unwrap(str))); 190 } 191 192 MlirAttribute mlirStringAttrTypedGet(MlirType type, MlirStringRef str) { 193 return wrap(StringAttr::get(unwrap(str), unwrap(type))); 194 } 195 196 MlirStringRef mlirStringAttrGetValue(MlirAttribute attr) { 197 return wrap(unwrap(attr).cast<StringAttr>().getValue()); 198 } 199 200 //===----------------------------------------------------------------------===// 201 // SymbolRef attribute. 202 //===----------------------------------------------------------------------===// 203 204 bool mlirAttributeIsASymbolRef(MlirAttribute attr) { 205 return unwrap(attr).isa<SymbolRefAttr>(); 206 } 207 208 MlirAttribute mlirSymbolRefAttrGet(MlirContext ctx, MlirStringRef symbol, 209 intptr_t numReferences, 210 MlirAttribute const *references) { 211 SmallVector<FlatSymbolRefAttr, 4> refs; 212 refs.reserve(numReferences); 213 for (intptr_t i = 0; i < numReferences; ++i) 214 refs.push_back(unwrap(references[i]).cast<FlatSymbolRefAttr>()); 215 return wrap(SymbolRefAttr::get(unwrap(ctx), unwrap(symbol), refs)); 216 } 217 218 MlirStringRef mlirSymbolRefAttrGetRootReference(MlirAttribute attr) { 219 return wrap(unwrap(attr).cast<SymbolRefAttr>().getRootReference()); 220 } 221 222 MlirStringRef mlirSymbolRefAttrGetLeafReference(MlirAttribute attr) { 223 return wrap(unwrap(attr).cast<SymbolRefAttr>().getLeafReference()); 224 } 225 226 intptr_t mlirSymbolRefAttrGetNumNestedReferences(MlirAttribute attr) { 227 return static_cast<intptr_t>( 228 unwrap(attr).cast<SymbolRefAttr>().getNestedReferences().size()); 229 } 230 231 MlirAttribute mlirSymbolRefAttrGetNestedReference(MlirAttribute attr, 232 intptr_t pos) { 233 return wrap(unwrap(attr).cast<SymbolRefAttr>().getNestedReferences()[pos]); 234 } 235 236 //===----------------------------------------------------------------------===// 237 // Flat SymbolRef attribute. 238 //===----------------------------------------------------------------------===// 239 240 bool mlirAttributeIsAFlatSymbolRef(MlirAttribute attr) { 241 return unwrap(attr).isa<FlatSymbolRefAttr>(); 242 } 243 244 MlirAttribute mlirFlatSymbolRefAttrGet(MlirContext ctx, MlirStringRef symbol) { 245 return wrap(FlatSymbolRefAttr::get(unwrap(ctx), unwrap(symbol))); 246 } 247 248 MlirStringRef mlirFlatSymbolRefAttrGetValue(MlirAttribute attr) { 249 return wrap(unwrap(attr).cast<FlatSymbolRefAttr>().getValue()); 250 } 251 252 //===----------------------------------------------------------------------===// 253 // Type attribute. 254 //===----------------------------------------------------------------------===// 255 256 bool mlirAttributeIsAType(MlirAttribute attr) { 257 return unwrap(attr).isa<TypeAttr>(); 258 } 259 260 MlirAttribute mlirTypeAttrGet(MlirType type) { 261 return wrap(TypeAttr::get(unwrap(type))); 262 } 263 264 MlirType mlirTypeAttrGetValue(MlirAttribute attr) { 265 return wrap(unwrap(attr).cast<TypeAttr>().getValue()); 266 } 267 268 //===----------------------------------------------------------------------===// 269 // Unit attribute. 270 //===----------------------------------------------------------------------===// 271 272 bool mlirAttributeIsAUnit(MlirAttribute attr) { 273 return unwrap(attr).isa<UnitAttr>(); 274 } 275 276 MlirAttribute mlirUnitAttrGet(MlirContext ctx) { 277 return wrap(UnitAttr::get(unwrap(ctx))); 278 } 279 280 //===----------------------------------------------------------------------===// 281 // Elements attributes. 282 //===----------------------------------------------------------------------===// 283 284 bool mlirAttributeIsAElements(MlirAttribute attr) { 285 return unwrap(attr).isa<ElementsAttr>(); 286 } 287 288 MlirAttribute mlirElementsAttrGetValue(MlirAttribute attr, intptr_t rank, 289 uint64_t *idxs) { 290 return wrap(unwrap(attr).cast<ElementsAttr>().getValue( 291 llvm::makeArrayRef(idxs, rank))); 292 } 293 294 bool mlirElementsAttrIsValidIndex(MlirAttribute attr, intptr_t rank, 295 uint64_t *idxs) { 296 return unwrap(attr).cast<ElementsAttr>().isValidIndex( 297 llvm::makeArrayRef(idxs, rank)); 298 } 299 300 int64_t mlirElementsAttrGetNumElements(MlirAttribute attr) { 301 return unwrap(attr).cast<ElementsAttr>().getNumElements(); 302 } 303 304 //===----------------------------------------------------------------------===// 305 // Dense elements attribute. 306 //===----------------------------------------------------------------------===// 307 308 //===----------------------------------------------------------------------===// 309 // IsA support. 310 311 bool mlirAttributeIsADenseElements(MlirAttribute attr) { 312 return unwrap(attr).isa<DenseElementsAttr>(); 313 } 314 bool mlirAttributeIsADenseIntElements(MlirAttribute attr) { 315 return unwrap(attr).isa<DenseIntElementsAttr>(); 316 } 317 bool mlirAttributeIsADenseFPElements(MlirAttribute attr) { 318 return unwrap(attr).isa<DenseFPElementsAttr>(); 319 } 320 321 //===----------------------------------------------------------------------===// 322 // Constructors. 323 324 MlirAttribute mlirDenseElementsAttrGet(MlirType shapedType, 325 intptr_t numElements, 326 MlirAttribute const *elements) { 327 SmallVector<Attribute, 8> attributes; 328 return wrap( 329 DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), 330 unwrapList(numElements, elements, attributes))); 331 } 332 333 MlirAttribute mlirDenseElementsAttrSplatGet(MlirType shapedType, 334 MlirAttribute element) { 335 return wrap(DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), 336 unwrap(element))); 337 } 338 MlirAttribute mlirDenseElementsAttrBoolSplatGet(MlirType shapedType, 339 bool element) { 340 return wrap( 341 DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), element)); 342 } 343 MlirAttribute mlirDenseElementsAttrUInt8SplatGet(MlirType shapedType, 344 uint8_t element) { 345 return wrap( 346 DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), element)); 347 } 348 MlirAttribute mlirDenseElementsAttrInt8SplatGet(MlirType shapedType, 349 int8_t element) { 350 return wrap( 351 DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), element)); 352 } 353 MlirAttribute mlirDenseElementsAttrUInt32SplatGet(MlirType shapedType, 354 uint32_t element) { 355 return wrap( 356 DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), element)); 357 } 358 MlirAttribute mlirDenseElementsAttrInt32SplatGet(MlirType shapedType, 359 int32_t element) { 360 return wrap( 361 DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), element)); 362 } 363 MlirAttribute mlirDenseElementsAttrUInt64SplatGet(MlirType shapedType, 364 uint64_t element) { 365 return wrap( 366 DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), element)); 367 } 368 MlirAttribute mlirDenseElementsAttrInt64SplatGet(MlirType shapedType, 369 int64_t element) { 370 return wrap( 371 DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), element)); 372 } 373 MlirAttribute mlirDenseElementsAttrFloatSplatGet(MlirType shapedType, 374 float element) { 375 return wrap( 376 DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), element)); 377 } 378 MlirAttribute mlirDenseElementsAttrDoubleSplatGet(MlirType shapedType, 379 double element) { 380 return wrap( 381 DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), element)); 382 } 383 384 MlirAttribute mlirDenseElementsAttrBoolGet(MlirType shapedType, 385 intptr_t numElements, 386 const int *elements) { 387 SmallVector<bool, 8> values(elements, elements + numElements); 388 return wrap( 389 DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), values)); 390 } 391 392 /// Creates a dense attribute with elements of the type deduced by templates. 393 template <typename T> 394 static MlirAttribute getDenseAttribute(MlirType shapedType, 395 intptr_t numElements, 396 const T *elements) { 397 return wrap( 398 DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), 399 llvm::makeArrayRef(elements, numElements))); 400 } 401 402 MlirAttribute mlirDenseElementsAttrUInt8Get(MlirType shapedType, 403 intptr_t numElements, 404 const uint8_t *elements) { 405 return getDenseAttribute(shapedType, numElements, elements); 406 } 407 MlirAttribute mlirDenseElementsAttrInt8Get(MlirType shapedType, 408 intptr_t numElements, 409 const int8_t *elements) { 410 return getDenseAttribute(shapedType, numElements, elements); 411 } 412 MlirAttribute mlirDenseElementsAttrUInt32Get(MlirType shapedType, 413 intptr_t numElements, 414 const uint32_t *elements) { 415 return getDenseAttribute(shapedType, numElements, elements); 416 } 417 MlirAttribute mlirDenseElementsAttrInt32Get(MlirType shapedType, 418 intptr_t numElements, 419 const int32_t *elements) { 420 return getDenseAttribute(shapedType, numElements, elements); 421 } 422 MlirAttribute mlirDenseElementsAttrUInt64Get(MlirType shapedType, 423 intptr_t numElements, 424 const uint64_t *elements) { 425 return getDenseAttribute(shapedType, numElements, elements); 426 } 427 MlirAttribute mlirDenseElementsAttrInt64Get(MlirType shapedType, 428 intptr_t numElements, 429 const int64_t *elements) { 430 return getDenseAttribute(shapedType, numElements, elements); 431 } 432 MlirAttribute mlirDenseElementsAttrFloatGet(MlirType shapedType, 433 intptr_t numElements, 434 const float *elements) { 435 return getDenseAttribute(shapedType, numElements, elements); 436 } 437 MlirAttribute mlirDenseElementsAttrDoubleGet(MlirType shapedType, 438 intptr_t numElements, 439 const double *elements) { 440 return getDenseAttribute(shapedType, numElements, elements); 441 } 442 443 MlirAttribute mlirDenseElementsAttrStringGet(MlirType shapedType, 444 intptr_t numElements, 445 MlirStringRef *strs) { 446 SmallVector<StringRef, 8> values; 447 values.reserve(numElements); 448 for (intptr_t i = 0; i < numElements; ++i) 449 values.push_back(unwrap(strs[i])); 450 451 return wrap( 452 DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), values)); 453 } 454 455 MlirAttribute mlirDenseElementsAttrReshapeGet(MlirAttribute attr, 456 MlirType shapedType) { 457 return wrap(unwrap(attr).cast<DenseElementsAttr>().reshape( 458 unwrap(shapedType).cast<ShapedType>())); 459 } 460 461 //===----------------------------------------------------------------------===// 462 // Splat accessors. 463 464 bool mlirDenseElementsAttrIsSplat(MlirAttribute attr) { 465 return unwrap(attr).cast<DenseElementsAttr>().isSplat(); 466 } 467 468 MlirAttribute mlirDenseElementsAttrGetSplatValue(MlirAttribute attr) { 469 return wrap(unwrap(attr).cast<DenseElementsAttr>().getSplatValue()); 470 } 471 int mlirDenseElementsAttrGetBoolSplatValue(MlirAttribute attr) { 472 return unwrap(attr).cast<DenseElementsAttr>().getSplatValue<bool>(); 473 } 474 int8_t mlirDenseElementsAttrGetInt8SplatValue(MlirAttribute attr) { 475 return unwrap(attr).cast<DenseElementsAttr>().getSplatValue<int8_t>(); 476 } 477 uint8_t mlirDenseElementsAttrGetUInt8SplatValue(MlirAttribute attr) { 478 return unwrap(attr).cast<DenseElementsAttr>().getSplatValue<uint8_t>(); 479 } 480 int32_t mlirDenseElementsAttrGetInt32SplatValue(MlirAttribute attr) { 481 return unwrap(attr).cast<DenseElementsAttr>().getSplatValue<int32_t>(); 482 } 483 uint32_t mlirDenseElementsAttrGetUInt32SplatValue(MlirAttribute attr) { 484 return unwrap(attr).cast<DenseElementsAttr>().getSplatValue<uint32_t>(); 485 } 486 int64_t mlirDenseElementsAttrGetInt64SplatValue(MlirAttribute attr) { 487 return unwrap(attr).cast<DenseElementsAttr>().getSplatValue<int64_t>(); 488 } 489 uint64_t mlirDenseElementsAttrGetUInt64SplatValue(MlirAttribute attr) { 490 return unwrap(attr).cast<DenseElementsAttr>().getSplatValue<uint64_t>(); 491 } 492 float mlirDenseElementsAttrGetFloatSplatValue(MlirAttribute attr) { 493 return unwrap(attr).cast<DenseElementsAttr>().getSplatValue<float>(); 494 } 495 double mlirDenseElementsAttrGetDoubleSplatValue(MlirAttribute attr) { 496 return unwrap(attr).cast<DenseElementsAttr>().getSplatValue<double>(); 497 } 498 MlirStringRef mlirDenseElementsAttrGetStringSplatValue(MlirAttribute attr) { 499 return wrap( 500 unwrap(attr).cast<DenseElementsAttr>().getSplatValue<StringRef>()); 501 } 502 503 //===----------------------------------------------------------------------===// 504 // Indexed accessors. 505 506 bool mlirDenseElementsAttrGetBoolValue(MlirAttribute attr, intptr_t pos) { 507 return *(unwrap(attr).cast<DenseElementsAttr>().getValues<bool>().begin() + 508 pos); 509 } 510 int8_t mlirDenseElementsAttrGetInt8Value(MlirAttribute attr, intptr_t pos) { 511 return *(unwrap(attr).cast<DenseElementsAttr>().getValues<int8_t>().begin() + 512 pos); 513 } 514 uint8_t mlirDenseElementsAttrGetUInt8Value(MlirAttribute attr, intptr_t pos) { 515 return *(unwrap(attr).cast<DenseElementsAttr>().getValues<uint8_t>().begin() + 516 pos); 517 } 518 int32_t mlirDenseElementsAttrGetInt32Value(MlirAttribute attr, intptr_t pos) { 519 return *(unwrap(attr).cast<DenseElementsAttr>().getValues<int32_t>().begin() + 520 pos); 521 } 522 uint32_t mlirDenseElementsAttrGetUInt32Value(MlirAttribute attr, intptr_t pos) { 523 return *( 524 unwrap(attr).cast<DenseElementsAttr>().getValues<uint32_t>().begin() + 525 pos); 526 } 527 int64_t mlirDenseElementsAttrGetInt64Value(MlirAttribute attr, intptr_t pos) { 528 return *(unwrap(attr).cast<DenseElementsAttr>().getValues<int64_t>().begin() + 529 pos); 530 } 531 uint64_t mlirDenseElementsAttrGetUInt64Value(MlirAttribute attr, intptr_t pos) { 532 return *( 533 unwrap(attr).cast<DenseElementsAttr>().getValues<uint64_t>().begin() + 534 pos); 535 } 536 float mlirDenseElementsAttrGetFloatValue(MlirAttribute attr, intptr_t pos) { 537 return *(unwrap(attr).cast<DenseElementsAttr>().getValues<float>().begin() + 538 pos); 539 } 540 double mlirDenseElementsAttrGetDoubleValue(MlirAttribute attr, intptr_t pos) { 541 return *(unwrap(attr).cast<DenseElementsAttr>().getValues<double>().begin() + 542 pos); 543 } 544 MlirStringRef mlirDenseElementsAttrGetStringValue(MlirAttribute attr, 545 intptr_t pos) { 546 return wrap( 547 *(unwrap(attr).cast<DenseElementsAttr>().getValues<StringRef>().begin() + 548 pos)); 549 } 550 551 //===----------------------------------------------------------------------===// 552 // Raw data accessors. 553 554 const void *mlirDenseElementsAttrGetRawData(MlirAttribute attr) { 555 return static_cast<const void *>( 556 unwrap(attr).cast<DenseElementsAttr>().getRawData().data()); 557 } 558 559 //===----------------------------------------------------------------------===// 560 // Opaque elements attribute. 561 //===----------------------------------------------------------------------===// 562 563 bool mlirAttributeIsAOpaqueElements(MlirAttribute attr) { 564 return unwrap(attr).isa<OpaqueElementsAttr>(); 565 } 566 567 //===----------------------------------------------------------------------===// 568 // Sparse elements attribute. 569 //===----------------------------------------------------------------------===// 570 571 bool mlirAttributeIsASparseElements(MlirAttribute attr) { 572 return unwrap(attr).isa<SparseElementsAttr>(); 573 } 574 575 MlirAttribute mlirSparseElementsAttribute(MlirType shapedType, 576 MlirAttribute denseIndices, 577 MlirAttribute denseValues) { 578 return wrap( 579 SparseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), 580 unwrap(denseIndices).cast<DenseElementsAttr>(), 581 unwrap(denseValues).cast<DenseElementsAttr>())); 582 } 583 584 MlirAttribute mlirSparseElementsAttrGetIndices(MlirAttribute attr) { 585 return wrap(unwrap(attr).cast<SparseElementsAttr>().getIndices()); 586 } 587 588 MlirAttribute mlirSparseElementsAttrGetValues(MlirAttribute attr) { 589 return wrap(unwrap(attr).cast<SparseElementsAttr>().getValues()); 590 } 591