Mesa (master): clover: Register an llvm diagnostic handler v3

Tom Stellard tstellar at kemper.freedesktop.org
Fri Oct 17 00:46:16 UTC 2014


Module: Mesa
Branch: master
Commit: 76136c29bbd78ea414c86402d4031855218dc42b
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=76136c29bbd78ea414c86402d4031855218dc42b

Author: Tom Stellard <thomas.stellard at amd.com>
Date:   Thu Sep 25 18:08:20 2014 -0700

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 at riseup.net>

---

 .../state_trackers/clover/llvm/invocation.cpp      |   25 ++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp b/src/gallium/state_trackers/clover/llvm/invocation.cpp
index 58ab8b1..5660761 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;
 }




More information about the mesa-commit mailing list