# User Guide for SPIR-V Target

## Introduction

The SPIR-V target provides code generation for the SPIR-V binary format described in the official SPIR-V specification.

## Target Triples

For cross-compilation into SPIR-V use option

`-target <Architecture><Subarchitecture>-<Vendor>-<OS>-<Environment>`

to specify the target triple:

> SPIR-V Architectures
> Architecture | Description
> --- | ---
> `spirv32` | SPIR-V with 32-bit pointer width.
> `spirv64` | SPIR-V with 64-bit pointer width.

> SPIR-V Subarchitectures
> Subarchitecture | Description
> --- | ---
> <empty> | SPIR-V version deduced by tools based on the compiled input.
> `v1.0` | SPIR-V version 1.0.
> `v1.1` | SPIR-V version 1.1.
> `v1.2` | SPIR-V version 1.2.
> `v1.3` | SPIR-V version 1.3.
> `v1.4` | SPIR-V version 1.4.
> `v1.5` | SPIR-V version 1.5.

> SPIR-V Vendors
> Vendor | Description
> --- | ---
> <empty>/`unknown` | Generic SPIR-V target without any vendor-specific settings.

> Operating Systems
> OS | Description
> --- | ---
> <empty>/`unknown` | Defaults to the OpenCL runtime.

> SPIR-V Environments
> Environment | Description
> --- | ---
> <empty>/`unknown` | Defaults to the OpenCL environment.

Example:

`-target spirv64v1.0` can be used to compile for SPIR-V version 1.0 with 64-bit pointer width.

## Representing special types in SPIR-V

SPIR-V specifies several kinds of opaque types. These types are represented using target extension types. These types are represented as follows:

> SPIR-V Opaque Types
> SPIR-V Type | LLVM type name | LLVM type arguments
> --- | --- | ---
> OpTypeImage | `spirv.Image` | sampled type, dimensionality, depth, arrayed, MS, sampled, image format, access qualifier
> OpTypeSampler | `spirv.Sampler` | (none)
> OpTypeSampledImage | `spirv.SampledImage` | sampled type, dimensionality, depth, arrayed, MS, sampled, image format, access qualifier
> OpTypeEvent | `spirv.Event` | (none)
> OpTypeDeviceEvent | `spirv.DeviceEvent` | (none)
> OpTypeReserveId | `spirv.ReserveId` | (none)
> OpTypeQueue | `spirv.Queue` | (none)
> OpTypePipe | `spirv.Pipe` | access qualifier
> OpTypePipeStorage | `spirv.PipeStorage` | (none)

All integer arguments take the same value as they do in their corresponding SPIR-V instruction. For example, the OpenCL type `image2d_depth_ro_t` would be represented in SPIR-V IR as `target("spirv.Image", void, 1, 1, 0, 0, 0, 0, 0)`, with its dimensionality parameter as `1` meaning 2D. Sampled image types include the parameters of its underlying image type, so that a sampled image for the previous type has the representation `target("spirv.SampledImage, void, 1, 1, 0, 0, 0, 0, 0)`.