diff options
author | Pierre Moreau <[email protected]> | 2018-02-10 21:41:19 +0100 |
---|---|---|
committer | Karol Herbst <[email protected]> | 2019-09-21 08:28:32 +0000 |
commit | 975a3c6ad398dff2f7c8e1d66dc46bdf2200a04b (patch) | |
tree | 0426931ff34f98373588beca07717acdb1b44e60 | |
parent | 2147386505015e3089d51e3e5bf58489ab912aa6 (diff) |
clover/llvm: Add options for dumping SPIR-V binaries
Reviewed-by: Karol Herbst <[email protected]>
Acked-by: Francisco Jerez <[email protected]>
-rw-r--r-- | src/gallium/state_trackers/clover/llvm/util.hpp | 4 | ||||
-rw-r--r-- | src/gallium/state_trackers/clover/spirv/invocation.cpp | 30 | ||||
-rw-r--r-- | src/gallium/state_trackers/clover/spirv/invocation.hpp | 4 |
3 files changed, 37 insertions, 1 deletions
diff --git a/src/gallium/state_trackers/clover/llvm/util.hpp b/src/gallium/state_trackers/clover/llvm/util.hpp index 222becd614e..02e73e65071 100644 --- a/src/gallium/state_trackers/clover/llvm/util.hpp +++ b/src/gallium/state_trackers/clover/llvm/util.hpp @@ -101,7 +101,8 @@ namespace clover { enum flag { clc = 1 << 0, llvm = 1 << 1, - native = 1 << 2 + native = 1 << 2, + spirv = 1 << 3, }; inline bool @@ -111,6 +112,7 @@ namespace clover { { "llvm", llvm, "Dump the generated LLVM IR for all kernels." }, { "native", native, "Dump kernel assembly code for targets " "specifying PIPE_SHADER_IR_NATIVE" }, + { "spirv", spirv, "Dump the generated SPIR-V for all kernels." }, DEBUG_NAMED_VALUE_END }; static const unsigned flags = diff --git a/src/gallium/state_trackers/clover/spirv/invocation.cpp b/src/gallium/state_trackers/clover/spirv/invocation.cpp index fbcbbe8cd19..fa5b4dba606 100644 --- a/src/gallium/state_trackers/clover/spirv/invocation.cpp +++ b/src/gallium/state_trackers/clover/spirv/invocation.cpp @@ -680,6 +680,30 @@ clover::spirv::is_valid_spirv(const std::vector<char> &binary, return spvTool.Validate(reinterpret_cast<const uint32_t *>(binary.data()), binary.size() / 4u); } + +std::string +clover::spirv::print_module(const std::vector<char> &binary, + const std::string &opencl_version) { + const spv_target_env target_env = + convert_opencl_str_to_target_env(opencl_version); + spvtools::SpirvTools spvTool(target_env); + spv_context spvContext = spvContextCreate(target_env); + if (!spvContext) + return "Failed to create an spv_context for disassembling the module."; + + spv_text disassembly; + spvBinaryToText(spvContext, + reinterpret_cast<const uint32_t *>(binary.data()), + binary.size() / 4u, SPV_BINARY_TO_TEXT_OPTION_NONE, + &disassembly, nullptr); + spvContextDestroy(spvContext); + + const std::string disassemblyStr = disassembly->str; + spvTextDestroy(disassembly); + + return disassemblyStr; +} + #else bool clover::spirv::is_valid_spirv(const std::vector<char> &/*binary*/, @@ -702,4 +726,10 @@ clover::spirv::link_program(const std::vector<module> &/*modules*/, r_log += "SPIR-V support in clover is not enabled.\n"; throw error(CL_LINKER_NOT_AVAILABLE); } + +std::string +clover::spirv::print_module(const std::vector<char> &binary, + const std::string &opencl_version) { + return std::string(); +} #endif diff --git a/src/gallium/state_trackers/clover/spirv/invocation.hpp b/src/gallium/state_trackers/clover/spirv/invocation.hpp index 715a125c5ff..472d8c0de71 100644 --- a/src/gallium/state_trackers/clover/spirv/invocation.hpp +++ b/src/gallium/state_trackers/clover/spirv/invocation.hpp @@ -46,6 +46,10 @@ namespace clover { // link dependencies between them. module link_program(const std::vector<module> &modules, const device &dev, const std::string &opts, std::string &r_log); + + // Returns a textual representation of the given binary. + std::string print_module(const std::vector<char> &binary, + const std::string &opencl_version); } } |