To have non-static buffers in local memory, it is necessary to pass them as arguments to the kernel. This was almost supported but the address space mapping was missing to perform the check (thanks to tstellar for pointing me in the right direction).
--- .../state_trackers/clover/llvm/invocation.cpp | 31 ++++++++++++++-------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp b/src/gallium/state_trackers/clover/llvm/invocation.cpp index dae61f7..5cb5724 100644 --- a/src/gallium/state_trackers/clover/llvm/invocation.cpp +++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp @@ -26,6 +26,7 @@ #include <clang/Frontend/TextDiagnosticBuffer.h> #include <clang/Frontend/TextDiagnosticPrinter.h> #include <clang/CodeGen/CodeGenAction.h> +#include <clang/Basic/TargetInfo.h> #include <llvm/Bitcode/BitstreamWriter.h> #include <llvm/Bitcode/ReaderWriter.h> #include <llvm/Linker.h> @@ -113,7 +114,7 @@ namespace { llvm::Module * compile(const std::string &source, const std::string &name, const std::string &triple, const std::string &processor, - const std::string &opts) { + const std::string &opts, clang::LangAS::Map& address_spaces) { clang::CompilerInstance c; clang::CompilerInvocation invocation; @@ -204,6 +205,9 @@ namespace { if (!c.ExecuteAction(act)) throw build_error(log); + // Get address spaces map to be able to find kernel argument address spaces + memcpy(address_spaces, c.getTarget().getAddressSpaceMap(), sizeof(address_spaces)); + return act.takeModule(); } @@ -282,7 +286,8 @@ namespace { module build_module_llvm(llvm::Module *mod, - const std::vector<llvm::Function *> &kernels) { + const std::vector<llvm::Function *> &kernels, + clang::LangAS::Map& address_spaces) { module m; struct pipe_llvm_program_header header; @@ -318,14 +323,17 @@ namespace { } if (arg_type->isPointerTy()) { - // XXX: Figure out LLVM->OpenCL address space mappings for each - // target. I think we need to ask clang what these are. For now, - // pretend everything is in the global address space. unsigned address_space = llvm::cast<llvm::PointerType>(arg_type)->getAddressSpace(); - switch (address_space) { - default: - args.push_back(module::argument(module::argument::global, arg_size)); - break; + if (address_space == + address_spaces[clang::LangAS::opencl_local - clang::LangAS::Offset]) { + args.push_back(module::argument(module::argument::local, arg_size)); + } + else if (address_space == + address_spaces[clang::LangAS::opencl_constant - clang::LangAS::Offset]) { + args.push_back(module::argument(module::argument::constant, arg_size)); + } + else { + args.push_back(module::argument(module::argument::global, arg_size)); } } else { args.push_back(module::argument(module::argument::scalar, arg_size)); @@ -358,10 +366,11 @@ clover::compile_program_llvm(const compat::string &source, std::string processor(target.begin(), 0, processor_str_len); std::string triple(target.begin(), processor_str_len + 1, target.size() - processor_str_len - 1); + clang::LangAS::Map address_spaces; // The input file name must have the .cl extension in order for the // CompilerInvocation class to recognize it as an OpenCL source file. - llvm::Module *mod = compile(source, "input.cl", triple, processor, opts); + llvm::Module *mod = compile(source, "input.cl", triple, processor, opts, address_spaces); find_kernels(mod, kernels); @@ -374,6 +383,6 @@ clover::compile_program_llvm(const compat::string &source, assert(0); return module(); default: - return build_module_llvm(mod, kernels); + return build_module_llvm(mod, kernels, address_spaces); } } -- 1.8.3.2 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev