spv_result_t spvBinaryHeaderGet(const spv_const_binary binary, const spv_endianness_t endian, spv_header_t* pHeader) { if (!binary->code) return SPV_ERROR_INVALID_BINARY; if (binary->wordCount < SPV_INDEX_INSTRUCTION) return SPV_ERROR_INVALID_BINARY; if (!pHeader) return SPV_ERROR_INVALID_POINTER; // TODO: Validation checking? pHeader->magic = spvFixWord(binary->code[SPV_INDEX_MAGIC_NUMBER], endian); pHeader->version = spvFixWord(binary->code[SPV_INDEX_VERSION_NUMBER], endian); pHeader->generator = spvFixWord(binary->code[SPV_INDEX_GENERATOR_NUMBER], endian); pHeader->bound = spvFixWord(binary->code[SPV_INDEX_BOUND], endian); pHeader->schema = spvFixWord(binary->code[SPV_INDEX_SCHEMA], endian); pHeader->instructions = &binary->code[SPV_INDEX_INSTRUCTION]; return SPV_SUCCESS; }
void spvInstructionCopy(const uint32_t* words, const SpvOp opcode, const uint16_t wordCount, const spv_endianness_t endian, spv_instruction_t* pInst) { pInst->opcode = opcode; pInst->words.resize(wordCount); for (uint16_t wordIndex = 0; wordIndex < wordCount; ++wordIndex) { pInst->words[wordIndex] = spvFixWord(words[wordIndex], endian); if (!wordIndex) { uint16_t thisWordCount; uint16_t thisOpcode; spvOpcodeSplit(pInst->words[wordIndex], &thisWordCount, &thisOpcode); assert(opcode == static_cast<SpvOp>(thisOpcode) && wordCount == thisWordCount && "Endianness failed!"); } } }