[Beignet] [PATCH] backend/src/backend: Handle -dump-opt-llvm=[PATH]
Manasi Navare
manasi.d.navare at intel.com
Mon Aug 3 03:36:36 PDT 2015
From: Laura Ekstrand <laura.d.ekstrand at intel.com>
Allows the user to request a dump of the LLVM-generated IR to the file
specified in [PATH].
Signed-off-by: Manasi Navare <manasi.d.navare at intel.com>
---
backend/src/backend/program.cpp | 37 ++++++++++++++++++++++++++++++++++---
1 file changed, 34 insertions(+), 3 deletions(-)
diff --git a/backend/src/backend/program.cpp b/backend/src/backend/program.cpp
index e4cdeaa..a9b5ff5 100644
--- a/backend/src/backend/program.cpp
+++ b/backend/src/backend/program.cpp
@@ -640,6 +640,7 @@ namespace gbe {
const char *options,
const char *temp_header_path,
std::vector<std::string>& clOpt,
+ std::string& dumpLLVMFileName,
std::string& clName,
int& optLevel,
size_t stringSize,
@@ -719,6 +720,11 @@ namespace gbe {
clOpt.push_back("__FAST_RELAXED_MATH__=1");
}
+ if(str.find("-dump-opt-llvm=") != std::string::npos) {
+ dumpLLVMFileName = str.substr(str.find("=") + 1);
+ continue; // Don't push this str back; ignore it.
+ }
+
clOpt.push_back(str);
}
free(str);
@@ -781,8 +787,10 @@ namespace gbe {
int optLevel = 1;
std::vector<std::string> clOpt;
std::string clName;
- if (!processSourceAndOption(source, options, NULL, clOpt, clName,
- optLevel, stringSize, err, errSize))
+ std::string dumpLLVMFileName;
+ if (!processSourceAndOption(source, options, NULL, clOpt,
+ dumpLLVMFileName, clName, optLevel,
+ stringSize, err, errSize))
return NULL;
gbe_program p;
@@ -804,6 +812,27 @@ 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.bool()) {
+ out_module->print(ostream, 0);
+ } //Otherwise, you'll have to make do without the dump.
+ }
+ #endif
+
p = gbe_program_new_from_llvm(deviceID, NULL, out_module, llvm_ctx, stringSize,
err, errSize, optLevel);
if (err != NULL)
@@ -834,7 +863,9 @@ namespace gbe {
int optLevel = 1;
std::vector<std::string> clOpt;
std::string clName;
- if (!processSourceAndOption(source, options, temp_header_path, clOpt, clName,
+ std::string dumpLLVMFileName;
+ if (!processSourceAndOption(source, options, temp_header_path, clOpt,
+ dumpLLVMFileName, clName,
optLevel, stringSize, err, errSize))
return NULL;
--
1.9.1
More information about the Beignet
mailing list