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.getName()), wrap(attribute.getValue())}; 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 int64_t mlirIntegerAttrGetValueSInt(MlirAttribute attr) { 133 return unwrap(attr).cast<IntegerAttr>().getSInt(); 134 } 135 136 uint64_t mlirIntegerAttrGetValueUInt(MlirAttribute attr) { 137 return unwrap(attr).cast<IntegerAttr>().getUInt(); 138 } 139 140 //===----------------------------------------------------------------------===// 141 // Bool attribute. 142 //===----------------------------------------------------------------------===// 143 144 bool mlirAttributeIsABool(MlirAttribute attr) { 145 return unwrap(attr).isa<BoolAttr>(); 146 } 147 148 MlirAttribute mlirBoolAttrGet(MlirContext ctx, int value) { 149 return wrap(BoolAttr::get(unwrap(ctx), value)); 150 } 151 152 bool mlirBoolAttrGetValue(MlirAttribute attr) { 153 return unwrap(attr).cast<BoolAttr>().getValue(); 154 } 155 156 //===----------------------------------------------------------------------===// 157 // Integer set attribute. 158 //===----------------------------------------------------------------------===// 159 160 bool mlirAttributeIsAIntegerSet(MlirAttribute attr) { 161 return unwrap(attr).isa<IntegerSetAttr>(); 162 } 163 164 //===----------------------------------------------------------------------===// 165 // Opaque attribute. 166 //===----------------------------------------------------------------------===// 167 168 bool mlirAttributeIsAOpaque(MlirAttribute attr) { 169 return unwrap(attr).isa<OpaqueAttr>(); 170 } 171 172 MlirAttribute mlirOpaqueAttrGet(MlirContext ctx, MlirStringRef dialectNamespace, 173 intptr_t dataLength, const char *data, 174 MlirType type) { 175 return wrap( 176 OpaqueAttr::get(StringAttr::get(unwrap(ctx), unwrap(dialectNamespace)), 177 StringRef(data, dataLength), unwrap(type))); 178 } 179 180 MlirStringRef mlirOpaqueAttrGetDialectNamespace(MlirAttribute attr) { 181 return wrap(unwrap(attr).cast<OpaqueAttr>().getDialectNamespace().strref()); 182 } 183 184 MlirStringRef mlirOpaqueAttrGetData(MlirAttribute attr) { 185 return wrap(unwrap(attr).cast<OpaqueAttr>().getAttrData()); 186 } 187 188 //===----------------------------------------------------------------------===// 189 // String attribute. 190 //===----------------------------------------------------------------------===// 191 192 bool mlirAttributeIsAString(MlirAttribute attr) { 193 return unwrap(attr).isa<StringAttr>(); 194 } 195 196 MlirAttribute mlirStringAttrGet(MlirContext ctx, MlirStringRef str) { 197 return wrap((Attribute)StringAttr::get(unwrap(ctx), unwrap(str))); 198 } 199 200 MlirAttribute mlirStringAttrTypedGet(MlirType type, MlirStringRef str) { 201 return wrap((Attribute)StringAttr::get(unwrap(str), unwrap(type))); 202 } 203 204 MlirStringRef mlirStringAttrGetValue(MlirAttribute attr) { 205 return wrap(unwrap(attr).cast<StringAttr>().getValue()); 206 } 207 208 //===----------------------------------------------------------------------===// 209 // SymbolRef attribute. 210 //===----------------------------------------------------------------------===// 211 212 bool mlirAttributeIsASymbolRef(MlirAttribute attr) { 213 return unwrap(attr).isa<SymbolRefAttr>(); 214 } 215 216 MlirAttribute mlirSymbolRefAttrGet(MlirContext ctx, MlirStringRef symbol, 217 intptr_t numReferences, 218 MlirAttribute const *references) { 219 SmallVector<FlatSymbolRefAttr, 4> refs; 220 refs.reserve(numReferences); 221 for (intptr_t i = 0; i < numReferences; ++i) 222 refs.push_back(unwrap(references[i]).cast<FlatSymbolRefAttr>()); 223 auto symbolAttr = StringAttr::get(unwrap(ctx), unwrap(symbol)); 224 return wrap(SymbolRefAttr::get(symbolAttr, refs)); 225 } 226 227 MlirStringRef mlirSymbolRefAttrGetRootReference(MlirAttribute attr) { 228 return wrap(unwrap(attr).cast<SymbolRefAttr>().getRootReference().getValue()); 229 } 230 231 MlirStringRef mlirSymbolRefAttrGetLeafReference(MlirAttribute attr) { 232 return wrap(unwrap(attr).cast<SymbolRefAttr>().getLeafReference().getValue()); 233 } 234 235 intptr_t mlirSymbolRefAttrGetNumNestedReferences(MlirAttribute attr) { 236 return static_cast<intptr_t>( 237 unwrap(attr).cast<SymbolRefAttr>().getNestedReferences().size()); 238 } 239 240 MlirAttribute mlirSymbolRefAttrGetNestedReference(MlirAttribute attr, 241 intptr_t pos) { 242 return wrap(unwrap(attr).cast<SymbolRefAttr>().getNestedReferences()[pos]); 243 } 244 245 //===----------------------------------------------------------------------===// 246 // Flat SymbolRef attribute. 247 //===----------------------------------------------------------------------===// 248 249 bool mlirAttributeIsAFlatSymbolRef(MlirAttribute attr) { 250 return unwrap(attr).isa<FlatSymbolRefAttr>(); 251 } 252 253 MlirAttribute mlirFlatSymbolRefAttrGet(MlirContext ctx, MlirStringRef symbol) { 254 return wrap(FlatSymbolRefAttr::get(unwrap(ctx), unwrap(symbol))); 255 } 256 257 MlirStringRef mlirFlatSymbolRefAttrGetValue(MlirAttribute attr) { 258 return wrap(unwrap(attr).cast<FlatSymbolRefAttr>().getValue()); 259 } 260 261 //===----------------------------------------------------------------------===// 262 // Type attribute. 263 //===----------------------------------------------------------------------===// 264 265 bool mlirAttributeIsAType(MlirAttribute attr) { 266 return unwrap(attr).isa<TypeAttr>(); 267 } 268 269 MlirAttribute mlirTypeAttrGet(MlirType type) { 270 return wrap(TypeAttr::get(unwrap(type))); 271 } 272 273 MlirType mlirTypeAttrGetValue(MlirAttribute attr) { 274 return wrap(unwrap(attr).cast<TypeAttr>().getValue()); 275 } 276 277 //===----------------------------------------------------------------------===// 278 // Unit attribute. 279 //===----------------------------------------------------------------------===// 280 281 bool mlirAttributeIsAUnit(MlirAttribute attr) { 282 return unwrap(attr).isa<UnitAttr>(); 283 } 284 285 MlirAttribute mlirUnitAttrGet(MlirContext ctx) { 286 return wrap(UnitAttr::get(unwrap(ctx))); 287 } 288 289 //===----------------------------------------------------------------------===// 290 // Elements attributes. 291 //===----------------------------------------------------------------------===// 292 293 bool mlirAttributeIsAElements(MlirAttribute attr) { 294 return unwrap(attr).isa<ElementsAttr>(); 295 } 296 297 MlirAttribute mlirElementsAttrGetValue(MlirAttribute attr, intptr_t rank, 298 uint64_t *idxs) { 299 return wrap(unwrap(attr) 300 .cast<ElementsAttr>() 301 .getValues<Attribute>()[llvm::makeArrayRef(idxs, rank)]); 302 } 303 304 bool mlirElementsAttrIsValidIndex(MlirAttribute attr, intptr_t rank, 305 uint64_t *idxs) { 306 return unwrap(attr).cast<ElementsAttr>().isValidIndex( 307 llvm::makeArrayRef(idxs, rank)); 308 } 309 310 int64_t mlirElementsAttrGetNumElements(MlirAttribute attr) { 311 return unwrap(attr).cast<ElementsAttr>().getNumElements(); 312 } 313 314 //===----------------------------------------------------------------------===// 315 // Dense elements attribute. 316 //===----------------------------------------------------------------------===// 317 318 //===----------------------------------------------------------------------===// 319 // IsA support. 320 321 bool mlirAttributeIsADenseElements(MlirAttribute attr) { 322 return unwrap(attr).isa<DenseElementsAttr>(); 323 } 324 bool mlirAttributeIsADenseIntElements(MlirAttribute attr) { 325 return unwrap(attr).isa<DenseIntElementsAttr>(); 326 } 327 bool mlirAttributeIsADenseFPElements(MlirAttribute attr) { 328 return unwrap(attr).isa<DenseFPElementsAttr>(); 329 } 330 331 //===----------------------------------------------------------------------===// 332 // Constructors. 333 334 MlirAttribute mlirDenseElementsAttrGet(MlirType shapedType, 335 intptr_t numElements, 336 MlirAttribute const *elements) { 337 SmallVector<Attribute, 8> attributes; 338 return wrap( 339 DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), 340 unwrapList(numElements, elements, attributes))); 341 } 342 343 MlirAttribute mlirDenseElementsAttrRawBufferGet(MlirType shapedType, 344 size_t rawBufferSize, 345 const void *rawBuffer) { 346 auto shapedTypeCpp = unwrap(shapedType).cast<ShapedType>(); 347 ArrayRef<char> rawBufferCpp(static_cast<const char *>(rawBuffer), 348 rawBufferSize); 349 bool isSplat = false; 350 if (!DenseElementsAttr::isValidRawBuffer(shapedTypeCpp, rawBufferCpp, 351 isSplat)) { 352 return mlirAttributeGetNull(); 353 } 354 return wrap(DenseElementsAttr::getFromRawBuffer(shapedTypeCpp, rawBufferCpp, 355 isSplat)); 356 } 357 358 MlirAttribute mlirDenseElementsAttrSplatGet(MlirType shapedType, 359 MlirAttribute element) { 360 return wrap(DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), 361 unwrap(element))); 362 } 363 MlirAttribute mlirDenseElementsAttrBoolSplatGet(MlirType shapedType, 364 bool element) { 365 return wrap( 366 DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), element)); 367 } 368 MlirAttribute mlirDenseElementsAttrUInt8SplatGet(MlirType shapedType, 369 uint8_t element) { 370 return wrap( 371 DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), element)); 372 } 373 MlirAttribute mlirDenseElementsAttrInt8SplatGet(MlirType shapedType, 374 int8_t element) { 375 return wrap( 376 DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), element)); 377 } 378 MlirAttribute mlirDenseElementsAttrUInt32SplatGet(MlirType shapedType, 379 uint32_t element) { 380 return wrap( 381 DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), element)); 382 } 383 MlirAttribute mlirDenseElementsAttrInt32SplatGet(MlirType shapedType, 384 int32_t element) { 385 return wrap( 386 DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), element)); 387 } 388 MlirAttribute mlirDenseElementsAttrUInt64SplatGet(MlirType shapedType, 389 uint64_t element) { 390 return wrap( 391 DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), element)); 392 } 393 MlirAttribute mlirDenseElementsAttrInt64SplatGet(MlirType shapedType, 394 int64_t element) { 395 return wrap( 396 DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), element)); 397 } 398 MlirAttribute mlirDenseElementsAttrFloatSplatGet(MlirType shapedType, 399 float element) { 400 return wrap( 401 DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), element)); 402 } 403 MlirAttribute mlirDenseElementsAttrDoubleSplatGet(MlirType shapedType, 404 double element) { 405 return wrap( 406 DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), element)); 407 } 408 409 MlirAttribute mlirDenseElementsAttrBoolGet(MlirType shapedType, 410 intptr_t numElements, 411 const int *elements) { 412 SmallVector<bool, 8> values(elements, elements + numElements); 413 return wrap( 414 DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), values)); 415 } 416 417 /// Creates a dense attribute with elements of the type deduced by templates. 418 template <typename T> 419 static MlirAttribute getDenseAttribute(MlirType shapedType, 420 intptr_t numElements, 421 const T *elements) { 422 return wrap( 423 DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), 424 llvm::makeArrayRef(elements, numElements))); 425 } 426 427 MlirAttribute mlirDenseElementsAttrUInt8Get(MlirType shapedType, 428 intptr_t numElements, 429 const uint8_t *elements) { 430 return getDenseAttribute(shapedType, numElements, elements); 431 } 432 MlirAttribute mlirDenseElementsAttrInt8Get(MlirType shapedType, 433 intptr_t numElements, 434 const int8_t *elements) { 435 return getDenseAttribute(shapedType, numElements, elements); 436 } 437 MlirAttribute mlirDenseElementsAttrUInt16Get(MlirType shapedType, 438 intptr_t numElements, 439 const uint16_t *elements) { 440 return getDenseAttribute(shapedType, numElements, elements); 441 } 442 MlirAttribute mlirDenseElementsAttrInt16Get(MlirType shapedType, 443 intptr_t numElements, 444 const int16_t *elements) { 445 return getDenseAttribute(shapedType, numElements, elements); 446 } 447 MlirAttribute mlirDenseElementsAttrUInt32Get(MlirType shapedType, 448 intptr_t numElements, 449 const uint32_t *elements) { 450 return getDenseAttribute(shapedType, numElements, elements); 451 } 452 MlirAttribute mlirDenseElementsAttrInt32Get(MlirType shapedType, 453 intptr_t numElements, 454 const int32_t *elements) { 455 return getDenseAttribute(shapedType, numElements, elements); 456 } 457 MlirAttribute mlirDenseElementsAttrUInt64Get(MlirType shapedType, 458 intptr_t numElements, 459 const uint64_t *elements) { 460 return getDenseAttribute(shapedType, numElements, elements); 461 } 462 MlirAttribute mlirDenseElementsAttrInt64Get(MlirType shapedType, 463 intptr_t numElements, 464 const int64_t *elements) { 465 return getDenseAttribute(shapedType, numElements, elements); 466 } 467 MlirAttribute mlirDenseElementsAttrFloatGet(MlirType shapedType, 468 intptr_t numElements, 469 const float *elements) { 470 return getDenseAttribute(shapedType, numElements, elements); 471 } 472 MlirAttribute mlirDenseElementsAttrDoubleGet(MlirType shapedType, 473 intptr_t numElements, 474 const double *elements) { 475 return getDenseAttribute(shapedType, numElements, elements); 476 } 477 MlirAttribute mlirDenseElementsAttrBFloat16Get(MlirType shapedType, 478 intptr_t numElements, 479 const uint16_t *elements) { 480 size_t bufferSize = numElements * 2; 481 const void *buffer = static_cast<const void *>(elements); 482 return mlirDenseElementsAttrRawBufferGet(shapedType, bufferSize, buffer); 483 } 484 485 MlirAttribute mlirDenseElementsAttrStringGet(MlirType shapedType, 486 intptr_t numElements, 487 MlirStringRef *strs) { 488 SmallVector<StringRef, 8> values; 489 values.reserve(numElements); 490 for (intptr_t i = 0; i < numElements; ++i) 491 values.push_back(unwrap(strs[i])); 492 493 return wrap( 494 DenseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), values)); 495 } 496 497 MlirAttribute mlirDenseElementsAttrReshapeGet(MlirAttribute attr, 498 MlirType shapedType) { 499 return wrap(unwrap(attr).cast<DenseElementsAttr>().reshape( 500 unwrap(shapedType).cast<ShapedType>())); 501 } 502 503 //===----------------------------------------------------------------------===// 504 // Splat accessors. 505 506 bool mlirDenseElementsAttrIsSplat(MlirAttribute attr) { 507 return unwrap(attr).cast<DenseElementsAttr>().isSplat(); 508 } 509 510 MlirAttribute mlirDenseElementsAttrGetSplatValue(MlirAttribute attr) { 511 return wrap( 512 unwrap(attr).cast<DenseElementsAttr>().getSplatValue<Attribute>()); 513 } 514 int mlirDenseElementsAttrGetBoolSplatValue(MlirAttribute attr) { 515 return unwrap(attr).cast<DenseElementsAttr>().getSplatValue<bool>(); 516 } 517 int8_t mlirDenseElementsAttrGetInt8SplatValue(MlirAttribute attr) { 518 return unwrap(attr).cast<DenseElementsAttr>().getSplatValue<int8_t>(); 519 } 520 uint8_t mlirDenseElementsAttrGetUInt8SplatValue(MlirAttribute attr) { 521 return unwrap(attr).cast<DenseElementsAttr>().getSplatValue<uint8_t>(); 522 } 523 int32_t mlirDenseElementsAttrGetInt32SplatValue(MlirAttribute attr) { 524 return unwrap(attr).cast<DenseElementsAttr>().getSplatValue<int32_t>(); 525 } 526 uint32_t mlirDenseElementsAttrGetUInt32SplatValue(MlirAttribute attr) { 527 return unwrap(attr).cast<DenseElementsAttr>().getSplatValue<uint32_t>(); 528 } 529 int64_t mlirDenseElementsAttrGetInt64SplatValue(MlirAttribute attr) { 530 return unwrap(attr).cast<DenseElementsAttr>().getSplatValue<int64_t>(); 531 } 532 uint64_t mlirDenseElementsAttrGetUInt64SplatValue(MlirAttribute attr) { 533 return unwrap(attr).cast<DenseElementsAttr>().getSplatValue<uint64_t>(); 534 } 535 float mlirDenseElementsAttrGetFloatSplatValue(MlirAttribute attr) { 536 return unwrap(attr).cast<DenseElementsAttr>().getSplatValue<float>(); 537 } 538 double mlirDenseElementsAttrGetDoubleSplatValue(MlirAttribute attr) { 539 return unwrap(attr).cast<DenseElementsAttr>().getSplatValue<double>(); 540 } 541 MlirStringRef mlirDenseElementsAttrGetStringSplatValue(MlirAttribute attr) { 542 return wrap( 543 unwrap(attr).cast<DenseElementsAttr>().getSplatValue<StringRef>()); 544 } 545 546 //===----------------------------------------------------------------------===// 547 // Indexed accessors. 548 549 bool mlirDenseElementsAttrGetBoolValue(MlirAttribute attr, intptr_t pos) { 550 return unwrap(attr).cast<DenseElementsAttr>().getValues<bool>()[pos]; 551 } 552 int8_t mlirDenseElementsAttrGetInt8Value(MlirAttribute attr, intptr_t pos) { 553 return unwrap(attr).cast<DenseElementsAttr>().getValues<int8_t>()[pos]; 554 } 555 uint8_t mlirDenseElementsAttrGetUInt8Value(MlirAttribute attr, intptr_t pos) { 556 return unwrap(attr).cast<DenseElementsAttr>().getValues<uint8_t>()[pos]; 557 } 558 int16_t mlirDenseElementsAttrGetInt16Value(MlirAttribute attr, intptr_t pos) { 559 return unwrap(attr).cast<DenseElementsAttr>().getValues<int16_t>()[pos]; 560 } 561 uint16_t mlirDenseElementsAttrGetUInt16Value(MlirAttribute attr, intptr_t pos) { 562 return unwrap(attr).cast<DenseElementsAttr>().getValues<uint16_t>()[pos]; 563 } 564 int32_t mlirDenseElementsAttrGetInt32Value(MlirAttribute attr, intptr_t pos) { 565 return unwrap(attr).cast<DenseElementsAttr>().getValues<int32_t>()[pos]; 566 } 567 uint32_t mlirDenseElementsAttrGetUInt32Value(MlirAttribute attr, intptr_t pos) { 568 return unwrap(attr).cast<DenseElementsAttr>().getValues<uint32_t>()[pos]; 569 } 570 int64_t mlirDenseElementsAttrGetInt64Value(MlirAttribute attr, intptr_t pos) { 571 return unwrap(attr).cast<DenseElementsAttr>().getValues<int64_t>()[pos]; 572 } 573 uint64_t mlirDenseElementsAttrGetUInt64Value(MlirAttribute attr, intptr_t pos) { 574 return unwrap(attr).cast<DenseElementsAttr>().getValues<uint64_t>()[pos]; 575 } 576 float mlirDenseElementsAttrGetFloatValue(MlirAttribute attr, intptr_t pos) { 577 return unwrap(attr).cast<DenseElementsAttr>().getValues<float>()[pos]; 578 } 579 double mlirDenseElementsAttrGetDoubleValue(MlirAttribute attr, intptr_t pos) { 580 return unwrap(attr).cast<DenseElementsAttr>().getValues<double>()[pos]; 581 } 582 MlirStringRef mlirDenseElementsAttrGetStringValue(MlirAttribute attr, 583 intptr_t pos) { 584 return wrap( 585 unwrap(attr).cast<DenseElementsAttr>().getValues<StringRef>()[pos]); 586 } 587 588 //===----------------------------------------------------------------------===// 589 // Raw data accessors. 590 591 const void *mlirDenseElementsAttrGetRawData(MlirAttribute attr) { 592 return static_cast<const void *>( 593 unwrap(attr).cast<DenseElementsAttr>().getRawData().data()); 594 } 595 596 //===----------------------------------------------------------------------===// 597 // Opaque elements attribute. 598 //===----------------------------------------------------------------------===// 599 600 bool mlirAttributeIsAOpaqueElements(MlirAttribute attr) { 601 return unwrap(attr).isa<OpaqueElementsAttr>(); 602 } 603 604 //===----------------------------------------------------------------------===// 605 // Sparse elements attribute. 606 //===----------------------------------------------------------------------===// 607 608 bool mlirAttributeIsASparseElements(MlirAttribute attr) { 609 return unwrap(attr).isa<SparseElementsAttr>(); 610 } 611 612 MlirAttribute mlirSparseElementsAttribute(MlirType shapedType, 613 MlirAttribute denseIndices, 614 MlirAttribute denseValues) { 615 return wrap( 616 SparseElementsAttr::get(unwrap(shapedType).cast<ShapedType>(), 617 unwrap(denseIndices).cast<DenseElementsAttr>(), 618 unwrap(denseValues).cast<DenseElementsAttr>())); 619 } 620 621 MlirAttribute mlirSparseElementsAttrGetIndices(MlirAttribute attr) { 622 return wrap(unwrap(attr).cast<SparseElementsAttr>().getIndices()); 623 } 624 625 MlirAttribute mlirSparseElementsAttrGetValues(MlirAttribute attr) { 626 return wrap(unwrap(attr).cast<SparseElementsAttr>().getValues()); 627 } 628