Francisco Jerez <curroje...@riseup.net> writes:

> Tom Stellard <thomas.stell...@amd.com> writes:
>
>> ---
>>  .../state_trackers/clover/llvm/invocation.cpp      | 30 
>> ++++++++++++++++++++++
>>  1 file changed, 30 insertions(+)
>>
>> diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp 
>> b/src/gallium/state_trackers/clover/llvm/invocation.cpp
>> index 088039a..a1a54e0 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>
>> @@ -551,6 +553,22 @@ namespace {
>>     }
>>  } // End anonymous namespace
>>  
>> +#if HAVE_LLVM >= 0x0305
>> +
>> +static void diagnostic_handler(const llvm::DiagnosticInfo &di, void 
>> *err_string) {

Oh, and can you define this function inside the anonymous namespace and
write the return type in a separate line as we're doing elsewhere?

>> +   if (di.getSeverity() == llvm::DS_Error) {
>> +      std::string message;
>> +      llvm::raw_string_ostream stream(message);
>> +      llvm::DiagnosticPrinterRawOStream dp(stream);
>> +      di.print(dp);
>> +      stream.flush();
>> +      std::string *out_string = (std::string*)err_string;
>> +      *out_string = message;
>> +   }
>> +}
>> +
>> +#endif
>> +
>>  module
>>  clover::compile_program_llvm(const compat::string &source,
>>                               enum pipe_shader_ir ir,
>> @@ -578,6 +596,11 @@ clover::compile_program_llvm(const compat::string 
>> &source,
>>     llvm::LLVMContext llvm_ctx;
>>     unsigned optimization_level;
>>  
>> +#if HAVE_LLVM >= 0x0305
>> +   std::string diagnostic_message;
>> +   llvm_ctx.setDiagnosticHandler(diagnostic_handler, &diagnostic_message);
>
> Maybe you could directly pass a pointer to r_log as argument to the
> diagnostic handler so you can avoid the problem below?
>
>> +#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_ctx, source, "input.cl", triple, 
>> processor,
>> @@ -607,5 +630,12 @@ clover::compile_program_llvm(const compat::string 
>> &source,
>>     // LLVM 3.6 and newer, the user takes ownership of the module.
>>     delete mod;
>>  #endif
>> +#if HAVE_LLVM >= 0x0305
>> +   if (diagnostic_message.size()) {
>> +      r_log = diagnostic_message;
>
> This is probably not executed if the compilation fails throwing an
> exception.
>
> And don't we want to append to the log instead of overwriting its
> previous contents?
>
> Thanks.
>
>> +      throw build_error();
>> +   }
>> +#endif
>> +
>>     return m;
>>  }
>> -- 
>> 1.8.5.5

Attachment: pgpIIimRo7X83.pgp
Description: PGP signature

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

Reply via email to