On 2018-02-22 — 11:00, Francisco Jerez wrote: > Pierre Moreau <pierre.mor...@free.fr> writes: > > > Signed-off-by: Pierre Moreau <pierre.mor...@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
signature.asc
Description: PGP signature
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev