backend/src/backend: Handle -dump-opt-llvm=[PATH] in clCompileProgram and clBuildProgram OpenCL API

Submitted by Manasi Navare on Aug. 14, 2015, 8:20 p.m.

Details

Message ID 87E1A67218970041879FDD2045F7145D027091C2@ORSMSX106.amr.corp.intel.com
State New
Headers show

Not browsing as part of any series.

Commit Message

Manasi Navare Aug. 14, 2015, 8:20 p.m.
This patch turns on llvm dump for both clCompileProgram and clBuildProgram in a way that they both share the piece of code added in buildModuleFromSource().
This patch also takes into account the llvm 3.3 fix submitted by Yejun.
Please review this patch and let me know the feedback.

Regards
Manasi

-----Original Message-----
From: Navare, Manasi D 
Sent: Friday, August 14, 2015 12:16 AM
To: Song, Ruiling; beignet@lists.freedesktop.org
Cc: Navare, Manasi D
Subject: [PATCH] backend/src/backend: Handle -dump-opt-llvm=[PATH] in clCompileProgram and clBuildProgram OpenCL API

Allows the user to request a dump of the LLVM-generated IR to the file specified in [PATH] through clCompileProgram options

Signed-off-by: Manasi Navare <manasi.d.navare@intel.com>
---
 backend/src/backend/program.cpp | 54 +++++++++++++++++++++++------------------
 1 file changed, 30 insertions(+), 24 deletions(-)

--
1.9.1

Patch hide | download patch | download mbox

diff --git a/backend/src/backend/program.cpp b/backend/src/backend/program.cpp index 6d539a9..4066a83 100644
--- a/backend/src/backend/program.cpp
+++ b/backend/src/backend/program.cpp
@@ -519,7 +519,7 @@  namespace gbe {
   BVAR(OCL_OUTPUT_BUILD_LOG, false);
 
   static bool buildModuleFromSource(const char* input, llvm::Module** out_module, llvm::LLVMContext* llvm_ctx,
-                                    std::vector<std::string>& options, size_t stringSize, char *err,
+                                    std::string dumpLLVMFileName, 
+ std::vector<std::string>& options, size_t stringSize, char *err,
                                     size_t *errSize) {
     // Arguments to pass to the clang frontend
     vector<const char *> args;
@@ -628,6 +628,33 @@  namespace gbe {
 #endif
 
     *out_module = module;
+
+// Dump the LLVM if requested.
+#if (LLVM_VERSION_MAJOR == 3) && (LLVM_VERSION_MINOR < 6)
+    if (!dumpLLVMFileName.empty()) {
+      std::string err;
+      llvm::raw_fd_ostream ostream (dumpLLVMFileName.c_str(),
+                                    err,
+      #if LLVM_VERSION_MINOR == 3
+                                    0,
+      #else
+                                    llvm::sys::fs::F_RW
+      #endif
+
+      if (err.empty()) {
+        (*out_module)->print(ostream, 0);
+      } //Otherwise, you'll have to make do without the dump.
+    }
+#else
+    if (!dumpLLVMFileName.empty()) {
+      std::error_code err;
+      llvm::raw_fd_ostream ostream (dumpLLVMFileName.c_str(),
+                                    err, llvm::sys::fs::F_RW);
+      if (!err) {
+        (*out_module)->print(ostream, 0);
+      } //Otherwise, you'll have to make do without the dump.
+    }
+#endif
     return true;
   }
 
@@ -808,7 +835,7 @@  namespace gbe {
     if (!llvm::llvm_is_multithreaded())
       llvm_mutex.lock();
 
-    if (buildModuleFromSource(clName.c_str(), &out_module, llvm_ctx, clOpt,
+    if (buildModuleFromSource(clName.c_str(), &out_module, llvm_ctx, 
+ dumpLLVMFileName, clOpt,
                               stringSize, err, errSize)) {
     // Now build the program from llvm
       size_t clangErrSize = 0;
@@ -819,27 +846,6 @@  namespace gbe {
         clangErrSize = *errSize;
       }
 
-      // Dump the LLVM if requested.
-      #if (LLVM_VERSION_MAJOR == 3) && (LLVM_VERSION_MINOR < 6)
-      if (!dumpLLVMFileName.empty()) {
-        std::string err;
-        llvm::raw_fd_ostream ostream (dumpLLVMFileName.c_str(),
-                                      err, llvm::sys::fs::F_RW);
-        if (err.empty()) {
-          out_module->print(ostream, 0);
-        } //Otherwise, you'll have to make do without the dump.
-      }
-      #else
-      if (!dumpLLVMFileName.empty()) {
-        std::error_code err;
-        llvm::raw_fd_ostream ostream (dumpLLVMFileName.c_str(),
-                                      err, llvm::sys::fs::F_RW);
-        if (!err) {
-          out_module->print(ostream, 0);
-        } //Otherwise, you'll have to make do without the dump.
-      }
-      #endif
-
       FILE *asmDumpStream = fopen(dumpASMFileName.c_str(), "w");  
       if (asmDumpStream)
         fclose(asmDumpStream);
@@ -885,7 +891,7 @@  namespace gbe {
     //for some functions, so we use global context now, need switch to new context later.
     llvm::Module * out_module;
     llvm::LLVMContext* llvm_ctx = &llvm::getGlobalContext();
-    if (buildModuleFromSource(clName.c_str(), &out_module, llvm_ctx, clOpt,
+    if (buildModuleFromSource(clName.c_str(), &out_module, llvm_ctx, 
+ dumpLLVMFileName, clOpt,
                               stringSize, err, errSize)) {
     // Now build the program from llvm
       if (err != NULL) {