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 auto symbolAttr = StringAttr::get(unwrap(ctx), unwrap(symbol)); 216 return wrap(SymbolRefAttr::get(symbolAttr, refs)); 217 } 218 219 MlirStringRef mlirSymbolRefAttrGetRootReference(MlirAttribute attr) { 220 return wrap(unwrap(attr).cast<SymbolRefAttr>().getRootReference().getValue()); 221 } 222 223 MlirStringRef mlirSymbolRefAttrGetLeafReference(MlirAttribute attr) { 224 return wrap(unwrap(attr).cast<SymbolRefAttr>().getLeafReference().getValue()); 225 } 226 227 intptr_t mlirSymbolRefAttrGetNumNestedReferences(MlirAttribute attr) { 228 return static_cast<intptr_t>( 229 unwrap(attr).cast<SymbolRefAttr>().getNestedReferences().size()); 230 } 231 232 MlirAttribute mlirSymbolRefAttrGetNestedReference(MlirAttribute attr, 233 intptr_t pos) { 234 return wrap(unwrap(attr).cast<SymbolRefAttr>().getNestedReferences()[pos]); 235 } 236 237 //===----------------------------------------------------------------------===// 238 // Flat SymbolRef attribute. 239 //===----------------------------------------------------------------------===// 240 241 bool mlirAttributeIsAFlatSymbolRef(MlirAttribute attr) { 242 return unwrap(attr).isa<FlatSymbolRefAttr>(); 243 } 244 245 MlirAttribute mlirFlatSymbolRefAttrGet(MlirContext ctx, MlirStringRef symbol) { 246 return wrap(FlatSymbolRefAttr::get(unwrap(ctx), unwrap(symbol))); 247 } 248 249 MlirStringRef mlirFlatSymbolRefAttrGetValue(MlirAttribute attr) { 250 return wrap(unwrap(attr).cast<FlatSymbolRefAttr>().getValue()); 251 } 252 253 //===----------------------------------------------------------------------===// 254 // Type attribute. 255 //===----------------------------------------------------------------------===// 256 257 bool mlirAttributeIsAType(MlirAttribute attr) { 258 return unwrap(attr).isa<TypeAttr>(); 259 } 260 261 MlirAttribute mlirTypeAttrGet(MlirType type) { 262 return wrap(TypeAttr::get(unwrap(type))); 263 } 264 265 MlirType mlirTypeAttrGetValue(MlirAttribute attr) { 266 return wrap(unwrap(attr).cast<TypeAttr>().getValue()); 267 } 268 269 //===----------------------------------------------------------------------===// 270 // Unit attribute. 271 //===----------------------------------------------------------------------===// 272 273 bool mlirAttributeIsAUnit(MlirAttribute attr) { 274 return unwrap(attr).isa<UnitAttr>(); 275 } 276 277 MlirAttribute mlirUnitAttrGet(MlirContext ctx) { 278 return wrap(UnitAttr::get(unwrap(ctx))); 279 } 280 281 //===----------------------------------------------------------------------===// 282 // Elements attributes. 283 //===----------------------------------------------------------------------===// 284 285 bool mlirAttributeIsAElements(MlirAttribute attr) { 286 return unwrap(attr).isa<ElementsAttr>(); 287 } 288 289 MlirAttribute mlirElementsAttrGetValue(MlirAttribute attr, intptr_t rank, 290 uint64_t *idxs) { 291 return wrap(unwrap(attr).cast<ElementsAttr>().getValue( 292 llvm::makeArrayRef(idxs, rank))); 293 } 294 295 bool mlirElementsAttrIsValidIndex(MlirAttribute attr, intptr_t rank, 296 uint64_t *idxs) { 297 return unwrap(attr).cast<ElementsAttr>().isValidIndex( 298 llvm::makeArrayRef(idxs, rank)); 299 } 300 301 int64_t mlirElementsAttrGetNumElements(MlirAttribute attr) { 302 return unwrap(attr).cast<ElementsAttr>().getNumElements(); 303 } 304 305 //===----------------------------------------------------------------------===// 306 // Dense elements attribute. 307 //===----------------------------------------------------------------------===// 308 309 //===----------------------------------------------------------------------===// 310 // IsA support. 311 312 bool mlirAttributeIsADenseElements(MlirAttribute attr) { 313 return unwrap(attr).isa<DenseElementsAttr>(); 314 } 315 bool mlirAttributeIsADenseIntElements(MlirAttribute attr) { 316 return unwrap(attr).isa<DenseIntElementsAttr>(); 317 } 318 bool mlirAttributeIsADenseFPElements(MlirAttribute attr) { 319 return unwrap(attr).isa<DenseFPElementsAttr>(); 320 } 321 322 //===----------------------------------------------------------------------===// 323 // Constructors. 324 325 MlirAttribute mlirDenseElementsAttrGet(MlirType shapedType, 326 intptr_t numElements, 327 MlirAttribute const *elements) { 328 SmallVector<Attribute, 8> attributes; 329 return wrap( 330 DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), 331 unwrapList(numElements, elements, attributes))); 332 } 333 334 MlirAttribute mlirDenseElementsAttrSplatGet(MlirType shapedType, 335 MlirAttribute element) { 336 return wrap(DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), 337 unwrap(element))); 338 } 339 MlirAttribute mlirDenseElementsAttrBoolSplatGet(MlirType shapedType, 340 bool element) { 341 return wrap( 342 DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), element)); 343 } 344 MlirAttribute mlirDenseElementsAttrUInt8SplatGet(MlirType shapedType, 345 uint8_t element) { 346 return wrap( 347 DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), element)); 348 } 349 MlirAttribute mlirDenseElementsAttrInt8SplatGet(MlirType shapedType, 350 int8_t element) { 351 return wrap( 352 DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), element)); 353 } 354 MlirAttribute mlirDenseElementsAttrUInt32SplatGet(MlirType shapedType, 355 uint32_t element) { 356 return wrap( 357 DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), element)); 358 } 359 MlirAttribute mlirDenseElementsAttrInt32SplatGet(MlirType shapedType, 360 int32_t element) { 361 return wrap( 362 DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), element)); 363 } 364 MlirAttribute mlirDenseElementsAttrUInt64SplatGet(MlirType shapedType, 365 uint64_t element) { 366 return wrap( 367 DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), element)); 368 } 369 MlirAttribute mlirDenseElementsAttrInt64SplatGet(MlirType shapedType, 370 int64_t element) { 371 return wrap( 372 DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), element)); 373 } 374 MlirAttribute mlirDenseElementsAttrFloatSplatGet(MlirType shapedType, 375 float element) { 376 return wrap( 377 DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), element)); 378 } 379 MlirAttribute mlirDenseElementsAttrDoubleSplatGet(MlirType shapedType, 380 double element) { 381 return wrap( 382 DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), element)); 383 } 384 385 MlirAttribute mlirDenseElementsAttrBoolGet(MlirType shapedType, 386 intptr_t numElements, 387 const int *elements) { 388 SmallVector<bool, 8> values(elements, elements + numElements); 389 return wrap( 390 DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), values)); 391 } 392 393 /// Creates a dense attribute with elements of the type deduced by templates. 394 template <typename T> 395 static MlirAttribute getDenseAttribute(MlirType shapedType, 396 intptr_t numElements, 397 const T *elements) { 398 return wrap( 399 DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), 400 llvm::makeArrayRef(elements, numElements))); 401 } 402 403 MlirAttribute mlirDenseElementsAttrUInt8Get(MlirType shapedType, 404 intptr_t numElements, 405 const uint8_t *elements) { 406 return getDenseAttribute(shapedType, numElements, elements); 407 } 408 MlirAttribute mlirDenseElementsAttrInt8Get(MlirType shapedType, 409 intptr_t numElements, 410 const int8_t *elements) { 411 return getDenseAttribute(shapedType, numElements, elements); 412 } 413 MlirAttribute mlirDenseElementsAttrUInt32Get(MlirType shapedType, 414 intptr_t numElements, 415 const uint32_t *elements) { 416 return getDenseAttribute(shapedType, numElements, elements); 417 } 418 MlirAttribute mlirDenseElementsAttrInt32Get(MlirType shapedType, 419 intptr_t numElements, 420 const int32_t *elements) { 421 return getDenseAttribute(shapedType, numElements, elements); 422 } 423 MlirAttribute mlirDenseElementsAttrUInt64Get(MlirType shapedType, 424 intptr_t numElements, 425 const uint64_t *elements) { 426 return getDenseAttribute(shapedType, numElements, elements); 427 } 428 MlirAttribute mlirDenseElementsAttrInt64Get(MlirType shapedType, 429 intptr_t numElements, 430 const int64_t *elements) { 431 return getDenseAttribute(shapedType, numElements, elements); 432 } 433 MlirAttribute mlirDenseElementsAttrFloatGet(MlirType shapedType, 434 intptr_t numElements, 435 const float *elements) { 436 return getDenseAttribute(shapedType, numElements, elements); 437 } 438 MlirAttribute mlirDenseElementsAttrDoubleGet(MlirType shapedType, 439 intptr_t numElements, 440 const double *elements) { 441 return getDenseAttribute(shapedType, numElements, elements); 442 } 443 444 MlirAttribute mlirDenseElementsAttrStringGet(MlirType shapedType, 445 intptr_t numElements, 446 MlirStringRef *strs) { 447 SmallVector<StringRef, 8> values; 448 values.reserve(numElements); 449 for (intptr_t i = 0; i < numElements; ++i) 450 values.push_back(unwrap(strs[i])); 451 452 return wrap( 453 DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), values)); 454 } 455 456 MlirAttribute mlirDenseElementsAttrReshapeGet(MlirAttribute attr, 457 MlirType shapedType) { 458 return wrap(unwrap(attr).cast<DenseElementsAttr>().reshape( 459 unwrap(shapedType).cast<ShapedType>())); 460 } 461 462 //===----------------------------------------------------------------------===// 463 // Splat accessors. 464 465 bool mlirDenseElementsAttrIsSplat(MlirAttribute attr) { 466 return unwrap(attr).cast<DenseElementsAttr>().isSplat(); 467 } 468 469 MlirAttribute mlirDenseElementsAttrGetSplatValue(MlirAttribute attr) { 470 return wrap(unwrap(attr).cast<DenseElementsAttr>().getSplatValue()); 471 } 472 int mlirDenseElementsAttrGetBoolSplatValue(MlirAttribute attr) { 473 return unwrap(attr).cast<DenseElementsAttr>().getSplatValue<bool>(); 474 } 475 int8_t mlirDenseElementsAttrGetInt8SplatValue(MlirAttribute attr) { 476 return unwrap(attr).cast<DenseElementsAttr>().getSplatValue<int8_t>(); 477 } 478 uint8_t mlirDenseElementsAttrGetUInt8SplatValue(MlirAttribute attr) { 479 return unwrap(attr).cast<DenseElementsAttr>().getSplatValue<uint8_t>(); 480 } 481 int32_t mlirDenseElementsAttrGetInt32SplatValue(MlirAttribute attr) { 482 return unwrap(attr).cast<DenseElementsAttr>().getSplatValue<int32_t>(); 483 } 484 uint32_t mlirDenseElementsAttrGetUInt32SplatValue(MlirAttribute attr) { 485 return unwrap(attr).cast<DenseElementsAttr>().getSplatValue<uint32_t>(); 486 } 487 int64_t mlirDenseElementsAttrGetInt64SplatValue(MlirAttribute attr) { 488 return unwrap(attr).cast<DenseElementsAttr>().getSplatValue<int64_t>(); 489 } 490 uint64_t mlirDenseElementsAttrGetUInt64SplatValue(MlirAttribute attr) { 491 return unwrap(attr).cast<DenseElementsAttr>().getSplatValue<uint64_t>(); 492 } 493 float mlirDenseElementsAttrGetFloatSplatValue(MlirAttribute attr) { 494 return unwrap(attr).cast<DenseElementsAttr>().getSplatValue<float>(); 495 } 496 double mlirDenseElementsAttrGetDoubleSplatValue(MlirAttribute attr) { 497 return unwrap(attr).cast<DenseElementsAttr>().getSplatValue<double>(); 498 } 499 MlirStringRef mlirDenseElementsAttrGetStringSplatValue(MlirAttribute attr) { 500 return wrap( 501 unwrap(attr).cast<DenseElementsAttr>().getSplatValue<StringRef>()); 502 } 503 504 //===----------------------------------------------------------------------===// 505 // Indexed accessors. 506 507 bool mlirDenseElementsAttrGetBoolValue(MlirAttribute attr, intptr_t pos) { 508 return *(unwrap(attr).cast<DenseElementsAttr>().getValues<bool>().begin() + 509 pos); 510 } 511 int8_t mlirDenseElementsAttrGetInt8Value(MlirAttribute attr, intptr_t pos) { 512 return *(unwrap(attr).cast<DenseElementsAttr>().getValues<int8_t>().begin() + 513 pos); 514 } 515 uint8_t mlirDenseElementsAttrGetUInt8Value(MlirAttribute attr, intptr_t pos) { 516 return *(unwrap(attr).cast<DenseElementsAttr>().getValues<uint8_t>().begin() + 517 pos); 518 } 519 int32_t mlirDenseElementsAttrGetInt32Value(MlirAttribute attr, intptr_t pos) { 520 return *(unwrap(attr).cast<DenseElementsAttr>().getValues<int32_t>().begin() + 521 pos); 522 } 523 uint32_t mlirDenseElementsAttrGetUInt32Value(MlirAttribute attr, intptr_t pos) { 524 return *( 525 unwrap(attr).cast<DenseElementsAttr>().getValues<uint32_t>().begin() + 526 pos); 527 } 528 int64_t mlirDenseElementsAttrGetInt64Value(MlirAttribute attr, intptr_t pos) { 529 return *(unwrap(attr).cast<DenseElementsAttr>().getValues<int64_t>().begin() + 530 pos); 531 } 532 uint64_t mlirDenseElementsAttrGetUInt64Value(MlirAttribute attr, intptr_t pos) { 533 return *( 534 unwrap(attr).cast<DenseElementsAttr>().getValues<uint64_t>().begin() + 535 pos); 536 } 537 float mlirDenseElementsAttrGetFloatValue(MlirAttribute attr, intptr_t pos) { 538 return *(unwrap(attr).cast<DenseElementsAttr>().getValues<float>().begin() + 539 pos); 540 } 541 double mlirDenseElementsAttrGetDoubleValue(MlirAttribute attr, intptr_t pos) { 542 return *(unwrap(attr).cast<DenseElementsAttr>().getValues<double>().begin() + 543 pos); 544 } 545 MlirStringRef mlirDenseElementsAttrGetStringValue(MlirAttribute attr, 546 intptr_t pos) { 547 return wrap( 548 *(unwrap(attr).cast<DenseElementsAttr>().getValues<StringRef>().begin() + 549 pos)); 550 } 551 552 //===----------------------------------------------------------------------===// 553 // Raw data accessors. 554 555 const void *mlirDenseElementsAttrGetRawData(MlirAttribute attr) { 556 return static_cast<const void *>( 557 unwrap(attr).cast<DenseElementsAttr>().getRawData().data()); 558 } 559 560 //===----------------------------------------------------------------------===// 561 // Opaque elements attribute. 562 //===----------------------------------------------------------------------===// 563 564 bool mlirAttributeIsAOpaqueElements(MlirAttribute attr) { 565 return unwrap(attr).isa<OpaqueElementsAttr>(); 566 } 567 568 //===----------------------------------------------------------------------===// 569 // Sparse elements attribute. 570 //===----------------------------------------------------------------------===// 571 572 bool mlirAttributeIsASparseElements(MlirAttribute attr) { 573 return unwrap(attr).isa<SparseElementsAttr>(); 574 } 575 576 MlirAttribute mlirSparseElementsAttribute(MlirType shapedType, 577 MlirAttribute denseIndices, 578 MlirAttribute denseValues) { 579 return wrap( 580 SparseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), 581 unwrap(denseIndices).cast<DenseElementsAttr>(), 582 unwrap(denseValues).cast<DenseElementsAttr>())); 583 } 584 585 MlirAttribute mlirSparseElementsAttrGetIndices(MlirAttribute attr) { 586 return wrap(unwrap(attr).cast<SparseElementsAttr>().getIndices()); 587 } 588 589 MlirAttribute mlirSparseElementsAttrGetValues(MlirAttribute attr) { 590 return wrap(unwrap(attr).cast<SparseElementsAttr>().getValues()); 591 } 592