The *ownership* model is encoded in the naming convention as follows.
-- By default, the ownership is not transerred.
-- Functions that tranfer the ownership of the result to the caller can be in
+- By default, the ownership is not transferred.
+- Functions that transfer the ownership of the result to the caller can be in
one of two forms:
* functions that create a new object have the name `mlirXCreate<...>`, for
example, `mlirOperationCreate`;
the callback points to a null-terminated string, the size argument should be
used to find the end of the string. The callback may be called multiple times
with consecutive chunks of the string representation (the printing itself is
-bufferred).
+buffered).
*Rationale*: this approach allows the caller to have full control of the
allocation and avoid unnecessary allocation and copying inside the printer.
An object has an _indexed component_ if it has fields accessible using a
zero-based contiguous integer index, typically arrays. For example, an
-`MlirBlock` has its arguments as a indexed component. An object may have several
-such components. For example, an `MlirOperation` has attributes, operands,
-regions, results and successors.
+`MlirBlock` has its arguments as an indexed component. An object may have
+several such components. For example, an `MlirOperation` has attributes,
+operands, regions, results and successors.
For indexed components, the following pair of functions is provided.
- `MlirY mlirXGet<Y>(MlirX, intptr_t pos)` returns 'pos'-th subobject.
The sizes are accepted and returned as signed pointer-sized integers, i.e.
-`intptr_t`. This typedef is avalable in C99.
+`intptr_t`. This typedef is available in C99.
Note that the name of subobject in the function does not necessarily match the
-type of the subobject. For example, `mlirOperationGetOperand` returns a
+type of the subobject. For example, `mlirOperationGetOperand` returns an
`MlirValue`.
### Iterable Components
### Extensions for Dialect Attributes and Types
-Dialect attributes and types can follow the example of standard attrbutes and
+Dialect attributes and types can follow the example of standard attributes and
types, provided that implementations live in separate directories, i.e.
`include/mlir-c/<...>Dialect/` and `lib/CAPI/<...>Dialect/`. The core APIs
provide implementation-private headers in `include/mlir/CAPI/IR` that allow one
to convert between opaque C structures for core IR components and their C++
counterparts. `wrap` converts a C++ class into a C structure and `unwrap` does
-the inverse conversion. Once the a C++ object is available, the API
+the inverse conversion. Once the C++ object is available, the API
implementation should rely on `isa` to implement `mlirXIsAY` and is expected to
use `cast` inside other API calls.
size of the previous struct elements) are **not** supported. In this case,
offsets can be emulated with padding fields (*e.g.* integers). However, such
a design would require index recalculation in the conversion of ops that
- involve memmory addressing.
+ involve memory addressing.
Examples of SPIR-V struct conversion are:
```mlir
be:
```mlir
- // Zero extending offest after broadcasting
+ // Zero extending offset after broadcasting
%res_offset = llvm.zext %vec_offset: !llvm.vec<2 x i8> to !llvm.vec<2 x i32>
```
llvm.store %c, %res : !llvm.ptr<i64>
```
-Note that simple conversion to `alloca` may not be sufficent if the code has
+Note that simple conversion to `alloca` may not be sufficient if the code has
some scoping. For example, if converting ops executed in a loop into `alloca`s,
a stack overflow may occur. For this case, `stacksave`/`stackrestore` pair can
be used (TODO).
`spv.Branch` and `spv.BranchConditional` are mapped to `llvm.br` and
`llvm.cond_br`. Branch weigths for `spv.BranchConditional` are mapped to
-coresponding `branch_weights` attribute of `llvm.cond_br`. When translated to
+corresponding `branch_weights` attribute of `llvm.cond_br`. When translated to
proper LLVM, `branch_weights` are converted into LLVM metadata associated with
the conditional branch.
### `spv.func`
This op declares or defines a SPIR-V function and it is converted to `llvm.func`.
-This conversion handles signarture conversion, and function control attributes
+This conversion handles signature conversion, and function control attributes
remapping to LLVM dialect function [`passthrough` attribute](Dialects/LLVM.md#Attribute-pass-through).
The following mapping is used to map [SPIR-V function control](SPIRVFunctionAttributes) to