[Mesa-dev] [PATCH v3 14/21] clover/llvm: Allow translating from SPIR-V to LLVM IR

Pierre Moreau pierre.morrow at free.fr
Fri Feb 23 10:35:58 UTC 2018


On 2018-02-22 — 11:00, Francisco Jerez wrote:
> Pierre Moreau <pierre.morrow at free.fr> writes:
> 
> > Signed-off-by: Pierre Moreau <pierre.morrow at free.fr>
> > ---
> >  .../state_trackers/clover/llvm/invocation.cpp      | 26 ++++++++++++++++++++++
> >  .../state_trackers/clover/llvm/invocation.hpp      |  4 ++++
> >  src/gallium/state_trackers/clover/meson.build      |  2 +-
> >  3 files changed, 31 insertions(+), 1 deletion(-)
> >
> > diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp b/src/gallium/state_trackers/clover/llvm/invocation.cpp
> > index e4ca5fa444..8fcf93eefd 100644
> > --- a/src/gallium/state_trackers/clover/llvm/invocation.cpp
> > +++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp
> > @@ -24,12 +24,15 @@
> >  // OTHER DEALINGS IN THE SOFTWARE.
> >  //
> >  
> > +#include <sstream>
> > +
> >  #include <llvm/IR/DiagnosticPrinter.h>
> >  #include <llvm/IR/DiagnosticInfo.h>
> >  #include <llvm/IR/LLVMContext.h>
> >  #include <llvm/Support/raw_ostream.h>
> >  #include <llvm/Transforms/IPO/PassManagerBuilder.h>
> >  #include <llvm-c/Target.h>
> > +#include <llvm-spirv/SPIRV.h>
> >  
> >  #include <clang/CodeGen/CodeGenAction.h>
> >  #include <clang/Lex/PreprocessorOptions.h>
> > @@ -301,3 +304,26 @@ clover::llvm::link_program(const std::vector<module> &modules,
> >        unreachable("Unsupported IR.");
> >     }
> >  }
> > +
> > +module
> > +clover::llvm::compile_from_spirv(const std::vector<char> &binary,
> > +                                 const device &dev,
> > +                                 std::string &r_log) {
> > +   auto ctx = create_context(r_log);
> > +
> > +   ::llvm::Module *unsafe_mod;
> > +   std::string error_msg;
> > +   std::stringstream input(std::ios_base::binary);
> > +   std::copy(binary.begin(), binary.end(), std::ostream_iterator<char>(input, ""));
> 
> Why do you need to std::copy the bytecode into a bidirectional
> stringstream?  Can't you use an std::istringstream initialized to the
> binary contents instead?

True, I should be able to do something like

    std::istringstream input({ binary.begin(), binary.end() }, std::ios_base::binary);

> 
> > +   if (!::llvm::ReadSPIRV(*ctx, input, unsafe_mod, error_msg)) {
> > +      r_log += "Failed to convert SPIR-V to LLVM IR: " + error_msg + ".\n";
> > +      throw error(CL_INVALID_VALUE);
> > +   }
> > +
> > +   std::unique_ptr<::llvm::Module> mod(unsafe_mod);
> > +
> > +   if (has_flag(debug::llvm))
> > +      debug::log(".ll", print_module_bitcode(*mod));
> > +
> > +   return build_module_library(*mod, module::section::text_intermediate);
> > +}
> > diff --git a/src/gallium/state_trackers/clover/llvm/invocation.hpp b/src/gallium/state_trackers/clover/llvm/invocation.hpp
> > index 5b3530c382..17fa416136 100644
> > --- a/src/gallium/state_trackers/clover/llvm/invocation.hpp
> > +++ b/src/gallium/state_trackers/clover/llvm/invocation.hpp
> > @@ -41,6 +41,10 @@ namespace clover {
> >                            const std::string &target,
> >                            const std::string &opts,
> >                            std::string &r_log);
> > +
> > +      module compile_from_spirv(const std::vector<char> &binary,
> > +                                const device &dev,
> > +                                std::string &r_log);
> >     }
> >  }
> >  
> > diff --git a/src/gallium/state_trackers/clover/meson.build b/src/gallium/state_trackers/clover/meson.build
> > index c52f0faa40..bffd0df11d 100644
> > --- a/src/gallium/state_trackers/clover/meson.build
> > +++ b/src/gallium/state_trackers/clover/meson.build
> > @@ -48,7 +48,7 @@ libclllvm = static_library(
> >        dep_llvm.get_configtool_variable('version'), 'include',
> >      )),
> >    ],
> > -  dependencies : [dep_llvm, dep_elf],
> > +  dependencies : [dep_llvm, dep_elf, dep_llvm_spirv],
> >  )
> >  
> >  clover_files = files(
> > -- 
> > 2.16.2



-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20180223/41753e5d/attachment.sig>


More information about the mesa-dev mailing list