1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
use crate::shared;

#[repr(u32)] // SPV_FORCE_32_BIT_ENUM
pub enum BinaryOptions {
    None = 0x1,
    PreserveNumberIds = 1 << 1,
}

#[repr(C)]
pub struct Text {
    pub data: *const std::os::raw::c_char,
    pub length: usize,
}

pub enum DisassembleOptions {
    None = 0x1,
    /// Print to stdout
    Print = 0x2,
    /// Add color codes to output
    Color = 0x4,
    /// Indent assembly
    Indent = 0x8,
    ShowByteOffset = 0x10,
    /// Do not output the module header as leading comments in the assembly.
    NoHeader = 0x20,
    /// Use friendly names where possible.  The heuristic may expand over
    /// time, but will use common names for scalar types, and debug names from
    /// OpName instructions.
    FriendlyNames = 0x40,
    /// Add some comments to the generated assembly
    Comment = 0x80,
}

extern "C" {
    /// Encodes the given SPIR-V assembly text to its binary representation. The
    /// length parameter specifies the number of bytes for text. Encoded binary will
    /// be stored into *binary. Any error will be written into *diagnostic if
    /// diagnostic is non-null, otherwise the context's message consumer will be
    /// used. The generated binary is independent of the context and may outlive it.
    /// The SPIR-V binary version is set to the highest version of SPIR-V supported
    /// by the context's target environment.
    ///
    /// The options parameter is a bit field of
    /// spv_text_to_binary_options_t.
    #[link_name = "spvTextToBinaryWithOptions"]
    pub fn assemble(
        tool: *const shared::ToolContext,
        text: *const std::os::raw::c_char,
        size: usize,
        options: u32,
        binary: *mut *mut shared::Binary,
        diagnostic: *mut *mut crate::diagnostics::Diagnostic,
    ) -> shared::SpirvResult;

    /// Decodes the given SPIR-V binary representation to its assembly text. The
    /// word_count parameter specifies the number of words for binary. The options
    /// parameter is a bit field of spv_binary_to_text_options_t. Decoded text will
    /// be stored into *text. Any error will be written into *diagnostic if
    /// diagnostic is non-null, otherwise the context's message consumer will be
    /// used.
    #[link_name = "spvBinaryToText"]
    pub fn disassemble(
        tool: *const shared::ToolContext,
        binary: *const u32,
        size: usize,
        options: u32,
        out_text: *mut *mut Text,
        diagnostic: *mut *mut crate::diagnostics::Diagnostic,
    ) -> shared::SpirvResult;

    /// Frees an allocated text stream. This is a no-op if the text parameter
    /// is a null pointer.
    #[link_name = "spvTextDestroy"]
    pub fn text_destroy(text: *mut Text);
}