[Beignet] [PATCH] backend/src/backend: Handle -dump-opt-llvm=[PATH] in clCompileProgram and clBuildProgram OpenCL API
Song, Ruiling
ruiling.song at intel.com
Mon Aug 17 20:03:24 PDT 2015
LGTM
Thanks!
Ruiling
> -----Original Message-----
> From: Navare, Manasi D
> Sent: Friday, August 14, 2015 3:16 PM
> To: Song, Ruiling; beignet at 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 at intel.com>
> ---
> backend/src/backend/program.cpp | 54 +++++++++++++++++++++++-------------
> -----
> 1 file changed, 30 insertions(+), 24 deletions(-)
>
> 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) {
> --
> 1.9.1
More information about the Beignet
mailing list