summaryrefslogtreecommitdiff
path: root/source/libspirv.cpp
diff options
context:
space:
mode:
authorLei Zhang <antiagainst@google.com>2016-09-16 16:12:04 -0400
committerLei Zhang <antiagainst@google.com>2016-09-21 14:41:47 -0400
commit620f05e679ac65373736969cae66b9f3ac73252d (patch)
tree12970be5fb98763b8f60a6389cc2bd04b884da4e /source/libspirv.cpp
parent92411caa3bcc271036c909482ae5951725b3aa5d (diff)
Publish the C++ interface.
Diffstat (limited to 'source/libspirv.cpp')
-rw-r--r--source/libspirv.cpp71
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