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