Expand description
§
SPIR-🇹
⋯🢒 🇹arget 🠆 🇹ransform 🠆 🇹ranslate ⋯🢒
SPIR-🇹 is a research project aimed at exploring shader-oriented IR designs derived from SPIR-V, and producing a framework around such an IR to facilitate advanced compilation pipelines, beyond what existing SPIR-V tooling allows for.
🚧 This project is in active design and development, many details can and will change 🚧
—
spirt @ 0.4.0-11-g5c42614
’sREADME
(click through for the full version)
Check out also the rust-gpu/spirt
GitHub repository,
for any additional developments.
§Notable types/modules
§IR data types
Context
: handles interning (Type
s,Const
s, etc.) and allocating entity handlesModule
: ownsFunc
s andGlobalVar
s (rooted byexports
)FuncDefBody
: ownsRegion
s and DataInsts (rooted bybody
)
§Utilities and passes
print
: pretty-printer with (styled and hyperlinked) HTML outputspv::lower
/spv::lift
: conversion from/to SPIR-Vcfg::Structurizer
: (re)structurization from arbitrary control-flow
Modules§
- Control-flow graph (CFG) abstractions and utilities.
- Tools for working with control-flow graphs that contain SSA dataflow (often abbreviated to
CFG<SSA>
or similar). - context 🔒
Context
and related types/traits. - Traversal helpers for intra-function entities.
- IR transformations (typically whole-
Module
). - Pretty-printing anything in the IR, from whole
Module
s to their leaves. QPtr
-related type definitions and passes.- Mutable IR traversal.
- Immutable IR traversal.
Structs§
- Interned handle for an
AttrSetDef
(a set ofAttr
s). - Interned handle for a
ConstDef
(a constant value). - Definition for a
Const
: a constant value. - Context object with global resources for SPIR-T.
- Entity handle for a
DataInstDef
(a leaf instruction). - Definition for a
DataInst
: a leaf (non-control-flow) instruction. - Simple
file:line:column
-style debuginfo, similar to SPIR-VOpLine
, but also supporting(line, column)
ranges, and inlined locations. - Diagnostics produced by SPIR-T passes, and recorded in
Attr::Diagnostics
. - Collection holding the actual definitions for
Context
-allocated entities. - Doubly-linked list, “intrusively” going through
E::Def
, which must be anEntityListNode<E, _>
(to hold the “previous/next node” links). EntityList<E>
iterator, but with a different API thanIterator
.- Map with
K
keys andV
values, that is: - Entity handle for a
FuncDecl
(a function). - Declaration/definition for a
Func
: a function. - The body of a
Func
definition. - Entity handle for a
GlobalVarDecl
(a global variable). - Declaration/definition for a
GlobalVar
: a global variable. - The body of a
GlobalVar
definition. - Interned handle for a
str
. - Entity handle for a
NodeDef
(a control-flow operator or leaf). - Definition for a
Node
: a control-flow operator or leaf. - Wrapper to limit
Ord
for interned index types (e.g.InternedStr
) to only situations where the interned index reflects contents (i.e. equality). - Entity handle for a
RegionDef
(a control-flow region). - Definition for a
Region
: a control-flow region. - Interned handle for a
TypeDef
. - Definition for a
Type
.
Enums§
- Any semantic or non-semantic (debuginfo) decoration/modifier, that can be optionally applied to some declaration/definition.
- Declarations (
GlobalVarDecl
,FuncDecl
) can contain a full definition, or only be an import of a definition (e.g. from another module). - The “severity” level of a
Diag
nostic. - One part of a
Diag
nostic message, allowing rich interpolation. - An unique identifier (e.g. a link name, or “symbol”) for a module export.
- A definition exported out of a module (see also
ExportKey
). - An identifier (e.g. a link name, or “symbol”) for an import declaration.
- Non-semantic details (i.e. debuginfo) of a SPIR-Y module (not tied to any declarations/definitions).
- Semantic properties of a SPIR-T module (not tied to any declarations/definitions).
Traits§
EntityOriented*Map<Self, V>
support trait, implemented for entity types, but which can also be implemented by users for their own newtypes and other types wrapping entity types (such as finiteenum
s).