summaryrefslogtreecommitdiff
path: root/source/binary.h
diff options
context:
space:
mode:
authorKenneth Benzie (Benie) <k.benzie@codeplay.com>2015-05-22 18:26:19 +0100
committerKenneth Benzie (Benie) <k.benzie@codeplay.com>2015-05-22 18:26:19 +0100
commit83e5a29b06e8e5b379b8fbc261d909457179c995 (patch)
treedd8dde701a2905938dbaccd3235c83ce5ce33d14 /source/binary.h
Code drop of the Codeplay spirv-tools source.
This commit contains the source for the SPIRV static library, spirv-as, spirv-dis, and spirv-val tools.
Diffstat (limited to 'source/binary.h')
-rw-r--r--source/binary.h166
1 files changed, 166 insertions, 0 deletions
diff --git a/source/binary.h b/source/binary.h
new file mode 100644
index 00000000..2ab5c66c
--- /dev/null
+++ b/source/binary.h
@@ -0,0 +1,166 @@
+// Copyright (c) 2015 The Khronos Group Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and/or associated documentation files (the
+// "Materials"), to deal in the Materials without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Materials, and to
+// permit persons to whom the Materials are furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Materials.
+//
+// MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS
+// KHRONOS STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS
+// SPECIFICATIONS AND HEADER INFORMATION ARE LOCATED AT
+// https://www.khronos.org/registry/
+//
+// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+
+#ifndef _LIBSPIRV_UTIL_BINARY_H_
+#define _LIBSPIRV_UTIL_BINARY_H_
+
+#include <libspirv/libspirv.h>
+#include "print.h"
+
+// Functions
+
+/// @brief Fix the endianness of a word
+///
+/// @param[in] word whos endianness should be fixed
+/// @param[in] endian the desired endianness
+///
+/// @return word with host endianness correction
+uint32_t spvFixWord(const uint32_t word, const spv_endianness_t endian);
+
+/// @brief Determine the endianness of the SPV binary
+///
+/// Gets the endianness of the SPV source. Returns SPV_ENDIANNESS_UNKNOWN if
+/// the
+/// SPV magic number is invalid, otherwise the determined endianness.
+///
+/// @param[in] binary the binary module
+/// @param[out] pEndian return the endianness of the SPV module
+///
+/// @return result code
+spv_result_t spvBinaryEndianness(const spv_binary binary,
+ spv_endianness_t *pEndian);
+
+/// @brief Grab the header from the SPV module
+///
+/// @param[in] binary the binary module
+/// @param[in] endian the endianness of the module
+/// @param[out] pHeader the returned header
+///
+/// @return result code
+spv_result_t spvBinaryHeaderGet(const spv_binary binary,
+ const spv_endianness_t endian,
+ spv_header_t *pHeader);
+
+/// @brief Populate a binary stream with this generators header
+///
+/// @param[in,out] binary the binary stream
+/// @param[in] bound the upper ID bound
+///
+/// @return result code
+spv_result_t spvBinaryHeaderSet(spv_binary binary, const uint32_t bound);
+
+/// @brief Append a single word into a binary stream
+///
+/// @param[in] value the word to encode
+/// @param[in] pInst the stream to append to
+/// @param[in,out] position position in the binary
+/// @param[out] pDiagnostic contains diagnostic on failure
+///
+/// @return result code
+spv_result_t spvBinaryEncodeU32(const uint32_t value, spv_instruction_t *pInst,
+ const spv_position position,
+ spv_diagnostic *pDiagnostic);
+
+/// @brief Append two related words into the binary stream
+///
+/// @param[in] value the two words to encode
+/// @param[in] pInst the stream to append to
+/// @param[in,out] position position in the binary
+/// @param[out] pDiagnostic contains diagnostic on failure
+///
+/// @return result code
+spv_result_t spvBinaryEncodeU64(const uint64_t value, spv_instruction_t *pInst,
+ const spv_position position,
+ spv_diagnostic *pDiagnostic);
+
+/// @brief Append a string literal in the binary stream
+///
+/// @param[in] str the string to encode
+/// @param[in] pInst the stream to append to
+/// @param[in,out] position position in the binary
+/// @param[out] pDiagnostic contains diagnostic on failure
+///
+/// @return result code
+spv_result_t spvBinaryEncodeString(const char *str, spv_instruction_t *pInst,
+ const spv_position position,
+ spv_diagnostic *pDiagnostic);
+
+/// @brief Determine the type of the desired operand
+///
+/// @param[in] word the operand value
+/// @param[in] index the word index in the instruction
+/// @param[in] opcodeEntry table of specified Opcodes
+/// @param[in] operandTable table of specified operands
+/// @param[in,out] pOperandEntry the entry in the operand table
+///
+/// @return type returned
+spv_operand_type_t spvBinaryOperandInfo(const uint32_t word,
+ const uint16_t index,
+ const spv_opcode_desc opcodeEntry,
+ const spv_operand_table operandTable,
+ spv_operand_desc *pOperandEntry);
+
+/// @brief Translate a binary operand to the textual form
+///
+/// @param[in] opcode of the current instruction
+/// @param[in] type type of the operand to decode
+/// @param[in] words the binary stream of words
+/// @param[in] endian the endianness of the stream
+/// @param[in] options bitfield of spv_binary_to_text_options_t values
+/// @param[in] operandTable table of specified operands
+/// @param[in,out] pExtInstType type of extended instruction library
+/// @param[in,out] stream the text output stream
+/// @param[in,out] position position in the binary stream
+/// @param[out] pDiag return diagnostic on error
+///
+/// @return result code
+spv_result_t spvBinaryDecodeOperand(
+ const Op opcode, const spv_operand_type_t type, const uint32_t *words,
+ const spv_endianness_t endian, const uint32_t options,
+ const spv_operand_table operandTable, const spv_ext_inst_table extInstTable,
+ spv_ext_inst_type_t *pExtInstType, out_stream &stream,
+ spv_position position, spv_diagnostic *pDiag);
+
+/// @brief Translate binary Opcode stream to textual form
+///
+/// @param[in] pInst the Opcode instruction stream
+/// @param[in] endian the endianness of the stream
+/// @param[in] options bitfield of spv_binary_to_text_options_t values
+/// @param[in] opcodeTable table of specified Opcodes
+/// @param[in] operandTable table of specified operands
+/// @param[out] stream output text stream
+/// @param[in,out] position position in the stream
+/// @param[out] pDiag return diagnostic on error
+///
+/// @return result code
+spv_result_t spvBinaryDecodeOpcode(
+ spv_instruction_t *pInst, const spv_endianness_t endian,
+ const uint32_t options, const spv_opcode_table opcodeTable,
+ const spv_operand_table operandTable, const spv_ext_inst_table extInstTable,
+ out_stream &stream, spv_position position, spv_diagnostic *pDiag);
+
+#endif
+