Re: [Mesa-dev] [PATCH] clover: Register an llvm diagnostic handler v2

2014-10-08 Thread Francisco Jerez
Tom Stellard thomas.stell...@amd.com writes:

 This will allow us to handle internal compiler errors.

 v2:
   - Code cleanups.
 ---
  .../state_trackers/clover/llvm/invocation.cpp  | 27 
 ++
  1 file changed, 27 insertions(+)

 diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp 
 b/src/gallium/state_trackers/clover/llvm/invocation.cpp
 index d9c3d11..5cc0825 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
 @@ -566,6 +568,26 @@ 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;
 + llvm::raw_string_ostream stream(message);
 + llvm::DiagnosticPrinterRawOStream dp(stream);
 + di.print(dp);
 + stream.flush();
 + compat::string *r_log = (compat::string*)data;
 + message.insert(0, *r_log);
 + *r_log = message;

Doesn't raw_string_ostream append to the end of the string?  You could
save a copy by doing it like:

|   std::string message = *(compat::string *)data;
|   llvm::raw_string_ostream stream(message);
|
| ...
|
|   stream.flush();
|   *(compat::string *)data = message;

 +
 + throw build_error();
 +  }
 +   }
 +
 +#endif
 +
 void
 init_targets() {
LLVMInitializeAllTargets();
 @@ -598,6 +620,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,
 @@ -629,5 +655,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;
  }
 -- 
 1.8.5.5


pgp9vZyr0FZqZ.pgp
Description: PGP signature
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH] clover: Register an llvm diagnostic handler v2

2014-10-07 Thread Tom Stellard
This will allow us to handle internal compiler errors.

v2:
  - Code cleanups.
---
 .../state_trackers/clover/llvm/invocation.cpp  | 27 ++
 1 file changed, 27 insertions(+)

diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp 
b/src/gallium/state_trackers/clover/llvm/invocation.cpp
index d9c3d11..5cc0825 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
@@ -566,6 +568,26 @@ 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;
+ llvm::raw_string_ostream stream(message);
+ llvm::DiagnosticPrinterRawOStream dp(stream);
+ di.print(dp);
+ stream.flush();
+ compat::string *r_log = (compat::string*)data;
+ message.insert(0, *r_log);
+ *r_log = message;
+
+ throw build_error();
+  }
+   }
+
+#endif
+
void
init_targets() {
   LLVMInitializeAllTargets();
@@ -598,6 +620,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,
@@ -629,5 +655,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;
 }
-- 
1.8.5.5

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev