[Mesa-dev] [PATCH 28/47] clover/llvm: Split bitcode codegen into separate file.

Francisco Jerez currojerez at riseup.net
Mon Jul 4 00:51:37 UTC 2016


Reviewed-by: Serge Martin <edb+mesa at sigluy.net>
---
 src/gallium/state_trackers/clover/Makefile.sources |  1 +
 src/gallium/state_trackers/clover/llvm/codegen.hpp |  7 ++
 .../state_trackers/clover/llvm/codegen/bitcode.cpp | 76 ++++++++++++++++++++++
 .../state_trackers/clover/llvm/invocation.cpp      | 35 ----------
 4 files changed, 84 insertions(+), 35 deletions(-)
 create mode 100644 src/gallium/state_trackers/clover/llvm/codegen/bitcode.cpp

diff --git a/src/gallium/state_trackers/clover/Makefile.sources b/src/gallium/state_trackers/clover/Makefile.sources
index 2f45611..bf0a533 100644
--- a/src/gallium/state_trackers/clover/Makefile.sources
+++ b/src/gallium/state_trackers/clover/Makefile.sources
@@ -54,6 +54,7 @@ CPP_SOURCES := \
 	util/tuple.hpp
 
 LLVM_SOURCES := \
+	llvm/codegen/bitcode.cpp \
 	llvm/codegen/common.cpp \
 	llvm/codegen.hpp \
 	llvm/compat.hpp \
diff --git a/src/gallium/state_trackers/clover/llvm/codegen.hpp b/src/gallium/state_trackers/clover/llvm/codegen.hpp
index 23f3b17..929bbda 100644
--- a/src/gallium/state_trackers/clover/llvm/codegen.hpp
+++ b/src/gallium/state_trackers/clover/llvm/codegen.hpp
@@ -38,6 +38,13 @@
 namespace clover {
    namespace llvm {
       module
+      build_module_bitcode(const ::llvm::Module &mod,
+                           const clang::CompilerInstance &c);
+
+      std::string
+      print_module_bitcode(const ::llvm::Module &mod);
+
+      module
       build_module_common(const ::llvm::Module &mod,
                           const std::vector<char> &code,
                           const std::map<std::string, unsigned> &offsets,
diff --git a/src/gallium/state_trackers/clover/llvm/codegen/bitcode.cpp b/src/gallium/state_trackers/clover/llvm/codegen/bitcode.cpp
new file mode 100644
index 0000000..d2baa07
--- /dev/null
+++ b/src/gallium/state_trackers/clover/llvm/codegen/bitcode.cpp
@@ -0,0 +1,76 @@
+//
+// Copyright 2012-2016 Francisco Jerez
+// Copyright 2012-2016 Advanced Micro Devices, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+// OTHER DEALINGS IN THE SOFTWARE.
+//
+
+///
+/// \file
+/// Trivial codegen back-end that simply passes through the existing LLVM IR
+/// and formats it so it can be consumed by pipe drivers.
+///
+
+#include "llvm/codegen.hpp"
+#include "llvm/metadata.hpp"
+#include "core/error.hpp"
+#include "util/algorithm.hpp"
+
+#include <map>
+#include <llvm/Bitcode/ReaderWriter.h>
+#include <llvm/Support/raw_ostream.h>
+
+using namespace clover;
+using namespace clover::llvm;
+
+namespace {
+   std::map<std::string, unsigned>
+   get_symbol_offsets(const ::llvm::Module &mod) {
+      std::map<std::string, unsigned> offsets;
+      unsigned i = 0;
+
+      for (const auto &name : map(std::mem_fn(&::llvm::Function::getName),
+                                  get_kernels(mod)))
+         offsets[name] = i++;
+
+      return offsets;
+   }
+
+   std::vector<char>
+   emit_code(const ::llvm::Module &mod) {
+      ::llvm::SmallVector<char, 1024> data;
+      ::llvm::raw_svector_ostream os { data };
+      WriteBitcodeToFile(&mod, os);
+      return { os.str().begin(), os.str().end() };
+   }
+}
+
+module
+clover::llvm::build_module_bitcode(const ::llvm::Module &mod,
+                                   const clang::CompilerInstance &c) {
+   return build_module_common(mod, emit_code(mod), get_symbol_offsets(mod), c);
+}
+
+std::string
+clover::llvm::print_module_bitcode(const ::llvm::Module &mod) {
+   std::string s;
+   ::llvm::raw_string_ostream os { s };
+   mod.print(os, NULL);
+   return os.str();
+}
diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp b/src/gallium/state_trackers/clover/llvm/invocation.cpp
index 857ae2a..54e2866 100644
--- a/src/gallium/state_trackers/clover/llvm/invocation.cpp
+++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp
@@ -250,41 +250,6 @@ namespace {
       pm.run(mod);
    }
 
-   std::map<std::string, unsigned>
-   get_symbol_offsets(const ::llvm::Module &mod) {
-      std::map<std::string, unsigned> offsets;
-      unsigned i = 0;
-
-      for (const auto &name : map(std::mem_fn(&::llvm::Function::getName),
-                                  get_kernels(mod)))
-         offsets[name] = i++;
-
-      return offsets;
-   }
-
-   std::vector<char>
-   emit_code(const ::llvm::Module &mod) {
-      ::llvm::SmallVector<char, 1024> data;
-      ::llvm::raw_svector_ostream os { data };
-      WriteBitcodeToFile(&mod, os);
-      return { os.str().begin(), os.str().end() };
-   }
-
-   module
-   build_module_bitcode(const ::llvm::Module &mod,
-                        const clang::CompilerInstance &c) {
-      return build_module_common(mod, emit_code(mod), get_symbol_offsets(mod),
-                                 c);
-   }
-
-   std::string
-   print_module_bitcode(const ::llvm::Module &mod) {
-      std::string s;
-      ::llvm::raw_string_ostream os { s };
-      mod.print(os, NULL);
-      return os.str();
-   }
-
    std::vector<char>
    emit_code(::llvm::Module &mod, const target &target,
              TargetMachine::CodeGenFileType ft,
-- 
2.9.0



More information about the mesa-dev mailing list