blob: b3f89f119c11d7d71b161ec9dc6668e4e73b941f [file] [log] [blame]
Lei Zhangabf8f642016-06-28 10:23:13 -04001// Copyright (c) 2016 Google Inc.
2//
David Neto9fc86582016-09-01 15:33:59 -04003// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
Lei Zhangabf8f642016-06-28 10:23:13 -04006//
David Neto9fc86582016-09-01 15:33:59 -04007// http://www.apache.org/licenses/LICENSE-2.0
Lei Zhangabf8f642016-06-28 10:23:13 -04008//
David Neto9fc86582016-09-01 15:33:59 -04009// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
Lei Zhangabf8f642016-06-28 10:23:13 -040014
15#include "libspirv.hpp"
16
17#include "ir_loader.h"
Lei Zhangf51d8232016-08-18 23:16:21 -040018#include "make_unique.h"
Lei Zhang8654caa2016-09-09 10:46:23 -040019#include "message.h"
Lei Zhang755f97f2016-09-02 18:06:18 -040020#include "table.h"
Lei Zhangabf8f642016-06-28 10:23:13 -040021
22namespace spvtools {
23
Lei Zhang8654caa2016-09-09 10:46:23 -040024// Structs for holding the data members for SpvTools.
25struct SpvTools::Impl {
26 explicit Impl(spv_target_env env) : context(spvContextCreate(env)) {
27 // The default consumer in spv_context_t is a null consumer, which provides
28 // equivalent functionality (from the user's perspective) as a real consumer
29 // does nothing.
30 }
31 ~Impl() { spvContextDestroy(context); }
32
33 spv_context context; // C interface context object.
34};
35
36SpvTools::SpvTools(spv_target_env env) : impl_(new Impl(env)) {}
37
38SpvTools::~SpvTools() {}
39
Lei Zhang755f97f2016-09-02 18:06:18 -040040void SpvTools::SetMessageConsumer(MessageConsumer consumer) {
Lei Zhang8654caa2016-09-09 10:46:23 -040041 SetContextMessageConsumer(impl_->context, std::move(consumer));
Lei Zhang755f97f2016-09-02 18:06:18 -040042}
43
Lei Zhang8654caa2016-09-09 10:46:23 -040044bool SpvTools::Assemble(const std::string& text,
45 std::vector<uint32_t>* binary) const {
Lei Zhangabf8f642016-06-28 10:23:13 -040046 spv_binary spvbinary = nullptr;
Lei Zhang8654caa2016-09-09 10:46:23 -040047 spv_result_t status = spvTextToBinary(impl_->context, text.data(),
48 text.size(), &spvbinary, nullptr);
Lei Zhangabf8f642016-06-28 10:23:13 -040049 if (status == SPV_SUCCESS) {
50 binary->assign(spvbinary->code, spvbinary->code + spvbinary->wordCount);
51 }
Lei Zhangabf8f642016-06-28 10:23:13 -040052 spvBinaryDestroy(spvbinary);
Lei Zhang8654caa2016-09-09 10:46:23 -040053 return status == SPV_SUCCESS;
Lei Zhangabf8f642016-06-28 10:23:13 -040054}
55
Lei Zhang8654caa2016-09-09 10:46:23 -040056bool SpvTools::Disassemble(const std::vector<uint32_t>& binary,
57 std::string* text, uint32_t options) const {
Lei Zhangabf8f642016-06-28 10:23:13 -040058 spv_text spvtext = nullptr;
Lei Zhang8654caa2016-09-09 10:46:23 -040059 spv_result_t status = spvBinaryToText(
60 impl_->context, binary.data(), binary.size(), options, &spvtext, nullptr);
Lei Zhangabf8f642016-06-28 10:23:13 -040061 if (status == SPV_SUCCESS) {
62 text->assign(spvtext->str, spvtext->str + spvtext->length);
63 }
Lei Zhangabf8f642016-06-28 10:23:13 -040064 spvTextDestroy(spvtext);
Lei Zhang8654caa2016-09-09 10:46:23 -040065 return status == SPV_SUCCESS;
66}
Lei Zhangabf8f642016-06-28 10:23:13 -040067
Lei Zhang8654caa2016-09-09 10:46:23 -040068bool SpvTools::Validate(const std::vector<uint32_t>& binary) const {
69 spv_const_binary_t b = {binary.data(), binary.size()};
70 return spvValidate(impl_->context, &b, nullptr) == SPV_SUCCESS;
Lei Zhangabf8f642016-06-28 10:23:13 -040071}
72
Lei Zhangabf8f642016-06-28 10:23:13 -040073} // namespace spvtools