diff options
author | Lei Zhang <antiagainst@google.com> | 2016-09-16 16:12:04 -0400 |
---|---|---|
committer | Lei Zhang <antiagainst@google.com> | 2016-09-21 14:41:47 -0400 |
commit | 620f05e679ac65373736969cae66b9f3ac73252d (patch) | |
tree | 12970be5fb98763b8f60a6389cc2bd04b884da4e /source/libspirv.cpp | |
parent | 92411caa3bcc271036c909482ae5951725b3aa5d (diff) |
Publish the C++ interface.
Diffstat (limited to 'source/libspirv.cpp')
-rw-r--r-- | source/libspirv.cpp | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/source/libspirv.cpp b/source/libspirv.cpp new file mode 100644 index 00000000..dcbfa154 --- /dev/null +++ b/source/libspirv.cpp @@ -0,0 +1,71 @@ +// Copyright (c) 2016 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "spirv-tools/libspirv.hpp" + +#include "message.h" +#include "table.h" + +namespace spvtools { + +// Structs for holding the data members for SpvTools. +struct SpirvTools::Impl { + explicit Impl(spv_target_env env) : context(spvContextCreate(env)) { + // The default consumer in spv_context_t is a null consumer, which provides + // equivalent functionality (from the user's perspective) as a real consumer + // does nothing. + } + ~Impl() { spvContextDestroy(context); } + + spv_context context; // C interface context object. +}; + +SpirvTools::SpirvTools(spv_target_env env) : impl_(new Impl(env)) {} + +SpirvTools::~SpirvTools() {} + +void SpirvTools::SetMessageConsumer(MessageConsumer consumer) { + SetContextMessageConsumer(impl_->context, std::move(consumer)); +} + +bool SpirvTools::Assemble(const std::string& text, + std::vector<uint32_t>* binary) const { + spv_binary spvbinary = nullptr; + spv_result_t status = spvTextToBinary(impl_->context, text.data(), + text.size(), &spvbinary, nullptr); + if (status == SPV_SUCCESS) { + binary->assign(spvbinary->code, spvbinary->code + spvbinary->wordCount); + } + spvBinaryDestroy(spvbinary); + return status == SPV_SUCCESS; +} + +bool SpirvTools::Disassemble(const std::vector<uint32_t>& binary, + std::string* text, uint32_t options) const { + spv_text spvtext = nullptr; + spv_result_t status = spvBinaryToText( + impl_->context, binary.data(), binary.size(), options, &spvtext, nullptr); + if (status == SPV_SUCCESS) { + text->assign(spvtext->str, spvtext->str + spvtext->length); + } + spvTextDestroy(spvtext); + return status == SPV_SUCCESS; +} + +bool SpirvTools::Validate(const std::vector<uint32_t>& binary) const { + spv_const_binary_t b = {binary.data(), binary.size()}; + return spvValidate(impl_->context, &b, nullptr) == SPV_SUCCESS; +} + +} // namespace spvtools |