|  | // 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_ |