diff options
author | Tom Stellard <thomas.stellard@amd.com> | 2014-09-25 18:08:20 -0700 |
---|---|---|
committer | Tom Stellard <thomas.stellard@amd.com> | 2014-10-16 16:22:58 -0400 |
commit | ae3d0495bc901ae923c77c674291ccfee09e762b (patch) | |
tree | 47cc666e5263c6b3c534c8e012b7c3c68591c0a9 | |
parent | f08b9a18bd6f612921d099407531f89c0e25f22d (diff) |
clover: Register an llvm diagnostic handler v3
This will allow us to handle internal compiler errors.
v2:
- Code cleanups.
v3:
- More cleanups.
Reviewed-by: Francisco Jerez <currojerez@riseup.net>
-rw-r--r-- | src/gallium/state_trackers/clover/llvm/invocation.cpp | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp b/src/gallium/state_trackers/clover/llvm/invocation.cpp index 58ab8b1b98c..56607615343 100644 --- a/src/gallium/state_trackers/clover/llvm/invocation.cpp +++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp @@ -33,6 +33,8 @@ #include <llvm/Linker.h> #else #include <llvm/Linker/Linker.h> +#include <llvm/IR/DiagnosticInfo.h> +#include <llvm/IR/DiagnosticPrinter.h> #endif #if HAVE_LLVM < 0x0303 #include <llvm/DerivedTypes.h> @@ -599,6 +601,24 @@ namespace { return m; } +#if HAVE_LLVM >= 0x0305 + + void + diagnostic_handler(const llvm::DiagnosticInfo &di, void *data) { + if (di.getSeverity() == llvm::DS_Error) { + std::string message = *(compat::string*)data; + llvm::raw_string_ostream stream(message); + llvm::DiagnosticPrinterRawOStream dp(stream); + di.print(dp); + stream.flush(); + *(compat::string*)data = message; + + throw build_error(); + } + } + +#endif + void init_targets() { static bool targets_initialized = false; @@ -630,6 +650,10 @@ clover::compile_program_llvm(const compat::string &source, llvm::LLVMContext llvm_ctx; unsigned optimization_level; +#if HAVE_LLVM >= 0x0305 + llvm_ctx.setDiagnosticHandler(diagnostic_handler, &r_log); +#endif + // 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_llvm(llvm_ctx, source, "input.cl", triple, @@ -661,5 +685,6 @@ clover::compile_program_llvm(const compat::string &source, // LLVM 3.6 and newer, the user takes ownership of the module. delete mod; #endif + return m; } |