[Mesa-dev] [PATCH 1/2] clover: Added missing address space checking of kernel parameters

Jonathan Charest jcharest+mesa-dev at gmail.com
Mon Jul 22 06:24:12 PDT 2013


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



More information about the mesa-dev mailing list