From 0c2f7255ceebf1fa32a4496ce686bf26a11f046d Mon Sep 17 00:00:00 2001 From: Jonathan Charest Date: Mon, 15 Jul 2013 15:58:46 -0400 Subject: [PATCH] Added missing address space checking of kernel parameters (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 #include #include +#include #include #include #include @@ -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 &kernels) { + const std::vector &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(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