| // Copyright (c) 2017 Pierre Moreau |
| // |
| // 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. |
| |
| #ifndef INCLUDE_SPIRV_TOOLS_LINKER_HPP_ |
| #define INCLUDE_SPIRV_TOOLS_LINKER_HPP_ |
| |
| #include <cstdint> |
| #include <memory> |
| #include <vector> |
| |
| #include "libspirv.hpp" |
| |
| namespace spvtools { |
| |
| class LinkerOptions { |
| public: |
| LinkerOptions() |
| : create_library_(false), |
| verify_ids_(false), |
| allow_partial_linkage_(false) {} |
| |
| // Returns whether a library or an executable should be produced by the |
| // linking phase. |
| // |
| // All exported symbols are kept when creating a library, whereas they will |
| // be removed when creating an executable. |
| // The returned value will be true if creating a library, and false if |
| // creating an executable. |
| bool GetCreateLibrary() const { return create_library_; } |
| |
| // Sets whether a library or an executable should be produced. |
| void SetCreateLibrary(bool create_library) { |
| create_library_ = create_library; |
| } |
| |
| // Returns whether to verify the uniqueness of the unique ids in the merged |
| // context. |
| bool GetVerifyIds() const { return verify_ids_; } |
| |
| // Sets whether to verify the uniqueness of the unique ids in the merged |
| // context. |
| void SetVerifyIds(bool verify_ids) { verify_ids_ = verify_ids; } |
| |
| // Returns whether to allow for imported symbols to have no corresponding |
| // exported symbols |
| bool GetAllowPartialLinkage() const { return allow_partial_linkage_; } |
| |
| // Sets whether to allow for imported symbols to have no corresponding |
| // exported symbols |
| void SetAllowPartialLinkage(bool allow_partial_linkage) { |
| allow_partial_linkage_ = allow_partial_linkage; |
| } |
| |
| private: |
| bool create_library_; |
| bool verify_ids_; |
| bool allow_partial_linkage_; |
| }; |
| |
| // Links one or more SPIR-V modules into a new SPIR-V module. That is, combine |
| // several SPIR-V modules into one, resolving link dependencies between them. |
| // |
| // At least one binary has to be provided in |binaries|. Those binaries do not |
| // have to be valid, but they should be at least parseable. |
| // The functions can fail due to the following: |
| // * The given context was not initialised using `spvContextCreate()`; |
| // * No input modules were given; |
| // * One or more of those modules were not parseable; |
| // * The input modules used different addressing or memory models; |
| // * The ID or global variable number limit were exceeded; |
| // * Some entry points were defined multiple times; |
| // * Some imported symbols did not have an exported counterpart; |
| // * Possibly other reasons. |
| spv_result_t Link(const Context& context, |
| const std::vector<std::vector<uint32_t>>& binaries, |
| std::vector<uint32_t>* linked_binary, |
| const LinkerOptions& options = LinkerOptions()); |
| spv_result_t Link(const Context& context, const uint32_t* const* binaries, |
| const size_t* binary_sizes, size_t num_binaries, |
| std::vector<uint32_t>* linked_binary, |
| const LinkerOptions& options = LinkerOptions()); |
| |
| } // namespace spvtools |
| |
| #endif // INCLUDE_SPIRV_TOOLS_LINKER_HPP_ |